#include "ShopServer.h"
#include <Zeit.h>
#include <iostream>
#include <fstream>
#include <Globals.h>
#include <sys/resource.h>

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/shop/" );
    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 << "ShS: Startet...\n";
    std::cout << "ShS: Lese init Datei ../data/shsInit.ini ...\n";
    InitDatei *dat = new InitDatei( "../data/shsInit.ini" );
    if( !dat->laden() )
    {
        std::cout << "ShS: error: Datei konnte nicht gelesen werden. Das Programm wird geschlossen.\n";
        dat->release();
        exit( 1 );
    }
    const char *wichtig[] = { "ServerId", "DBBenutzer", "DBPasswort", "DBName", "DBIP", "DBPort", "Aktiv", "ShopSeitenPfad", "SSLCert", "SSLKey", "SSLPasswort" };
    for( const char *w : wichtig )
    {
        if( !dat->wertExistiert( w ) )
        {
            std::cout << "ShS: error: Der Wert '" << w << "' wurde nicht gefunden. Das Programm wird geschlossen.\n";
            dat->release();
            exit( 1 );
        }
    }

    ShopServer *shServer = new ShopServer( dat );

    std::cout << "ShS: Der Admin Server läuft. Startforgang beendet.\n";
    shServer->runn();

    shServer->ende();
    shServer->release();
    dat->release();
    std::cout << "ShS: Der Server ist heruntergefahren.\n";
    file.close();
    std::cout.rdbuf( sbuf );
    Framework::releaseFramework();
    return 0;
}