#include <iostream>
#include <fstream>
#include <Zeit.h>
#include <Datei.h>
#include <Text.h>
#include <Globals.h>
#include <sys/resource.h>
#include <Klient.h>
#include <cstdlib>
#include <csignal>

#include "Server.h"

FactoryCraftServer* mserver = 0;

void exit()
{
    std::cout << "Der Server wird beendet...\n";
    if( mserver )
        mserver->close();
}

int main()
{
    struct rlimit core_limits;
    core_limits.rlim_cur = core_limits.rlim_max = RLIM_INFINITY;
    setrlimit( RLIMIT_CORE, &core_limits );

    Framework::initFramework();
    Zeit* z = getZeit();
    Text* pfad = new Text( "log/" );
    pfad->append( z->getZeit( "y-m-d_h-i-s.log" ) );
    z->release();
    DateiPfadErstellen( pfad->getText() );
    std::ofstream file;
    file.open( pfad->getText() );
    std::streambuf* sbuf = std::cout.rdbuf();
    //std::cout.rdbuf( file.rdbuf() );
    pfad->release();

    std::cout << "Startet...\n";
    std::cout << "Lese init Datei fcInit.ini ...\n";

    InitDatei* dat = new InitDatei( "fcInit.ini" );
    if( !dat->laden() )
    {
        std::cout << "error: Datei konnte nicht gelesen werden. Das Programm wird geschlossen.\n";
        dat->release();
        file.close();
        std::cout.rdbuf( sbuf );
        exit( 1 );
    }
    const char* wichtig[] = { "SSLPort", "SSLCert", "SSLKey", "SSLPasswort", "Port" };
    for( const char* w : wichtig )
    {
        if( !dat->wertExistiert( w ) )
        {
            std::cout << "error: Der Wert '" << w << "' wurde nicht gefunden. Das Programm wird geschlossen.\n";
            dat->release();
            file.close();
            std::cout.rdbuf( sbuf );
            exit( 1 );
        }
    }

    mserver = new FactoryCraftServer( dat );
    std::atexit( exit );
    signal( SIGTERM, exit );
    signal( SIGSEGV, exit );
    signal( SIGILL, exit );
    signal( SIGABRT, exit );
    signal( SIGFPE, exit );
    signal( SIGINT, exit );

    std::cout << "Der Server l�uft. Startforgang beendet.\n";
    mserver->run();
    mserver->release();
    mserver = 0;
    dat->release();
    std::cout << "Der Server ist heruntergefahren.\n";
    file.close();
    std::cout.rdbuf( sbuf );
    Framework::releaseFramework();
    return 0;
}