//---------------------------------------------------------------------------
#ifndef PortalH
#define PortalH
#include "SkemaKontrol.h"
#include "SqlKlasse.h"
#include "Export.h"
#include "TagTid1.h"
//---------------------------------------------------------------------------
class Portal
{
public:
  //konstruktør
    Portal(const string PlanID_, int col, int row, char Kilde_ = 'f');
    //destructor
    ~Portal();

  //Afslutnings funktion
    //Funktionen gemme alt hvad der ligger af lektioner på holdskemerne til databasen,
    //samt alle de prioriteter der ligger på lærenes skemaer.
    bool GemSkemaer();

    //Funktionen exportere enten hold, lærer eller lokale skemaerne til en
    //samlet fil.
    bool GemSkemaerPaaFil(char type);

    //Funktionen printer det skema som hører til ID'et indenfor typen.
    bool PrintSkema(const string& ID, char type);

  //Initialiserings funktioner
    //Funktionen styrer hele indlæsnings proceduren. DVS at hvad der har med
    //oprettelse af skemaer samt indlæsning af lektioner at gøre. Denne kalder
    //derfor "OpretAlleSkemaerFor" og "HentLektioner"
    bool KlargoerOgHentSkemaer();

    //Funktionen henter fra databasen alle lektioner ind, hvorefter disse placeres
    //på de enkelte skemaer.!
    bool HentLektioner();

    //Funktionen henter fra databasen alle prioriteter ind og placere dem på
    //lærere skemaerne.
    bool HentPLektioner();

    //Funktionen benyttes førend alle skemaerne oprettes. Det er af disse stacks
    //hvor navnene kommer fra...
    void Initialisering(stack<string>* HoldListe_, stack<string>* LaererListe_,
                        stack<string>* LokaleListe_);

  //Opret funktion
    //Funktionen kontakter KontrolKlassen hvorefter navnene på de enkelte
    //skemaer som skal oprettes returneres. Herefter oprettes skemaerne i planen.
    bool OpretAlleSkemaerFor(char type);

  //Kontrol funktion
    //Funktionen konstrollere om alle hold lektionerne har tilsvarende lektioner
    //ude på lokale og lærer skemaerne og omvendt. DVS at denne funktion
    //kontrollere om der er gået noget galt med skemaerne så der er opstået
    //fejl i skemaerne.
    bool KontrollerSkemaer();

  //bi-funktioner
    //funktionen beregner det totale antal mellem lektioner på hold skemaerne.
    int AntalMellemLektioner();

    //funktionen ændre de af brugeren fastsatte skemagrænser.
    AendreGraenser(int col, int row) { max_col = col; max_row = row; SkemaKPtr->AendreGraenser(col, row); }

private:
    SkemaKontrol* SkemaKPtr; //Pointer til planen!
    SqlKlasse* db; //Pointer til Sqlklassen.
    string PlanID; //skal benyttes i sql kald
    string TimeFagFordelingsID; //Skal benyttes ï Sql kald
    int max_col;
    int max_row;
    char Kilde; //Angiver om der benyttes database eller filer ('d' el 'f')
    stack<string>* HoldListe;   //Liste indeholdende ID'er for hold.
    stack<string>* LaererListe; //Liste indeholdende ID'er for læerer
    stack<string>* LokaleListe; //Liste indeholdende ID'er for lokaler
    Export Export; //objekt af Export klassen.
    comm comm; //objekt til kommunikations klassen. går direkte til brugergrænsen

public:
//----------------------------------------------------------------------------//
//Følgende funktioner er Skin funktioner. DVS at de viser direkte videre til
//funktioner lokaliseret i plan klassen uden at gøre noget
  //Hent funktioner
    bool HentSkema(const string& ID, stack<LektionsData*>*& Stack, char type);
    bool HentPSkema(stack<PLektionsData*>& Stack, const string& LaererID);

  //Udskrivs funktioner
    void UdskrivAlleSkemaer();
    void UdskrivSkema(const string& ID, char type);
    void UdskrivPSkema(const string& ID);
    void SletAlt();

  //Opret skema funktion
    bool OpretSkema(string& ID, char type);

  //Optællings funktioner
	double BeregnVariansFor(const string& ID, char type);
	int BeregnTotaleLagteLektioner();
    int LagteFagLektioner(string HoldID, string FagID);
    int SkemalagteLektioner(string ID, char type);
    int LagtePLektioner(string LaererID);

  //access funktioner
    bool ErLektionTom(string ID, char type, int col, int row);
    bool ErFagLektion(string HoldID, string FagID, int col, int row);
    bool ErLektionDobbelt(string ID, char type,int col, int row);

  //Opret funktioner
    bool VurderOgLaegPLektion(string LaererID, int prioritet, int col, int row);
    void OpretOgLaegLektion(string HoldID, string FagID, string LaererID,
                            string LokaleID, int blok, int col, int row);
  //Byt funktioner
    void BytLektion(string ID, int blok, char type, int fra_col, int fra_row,
                    int til_col, int til_row);
    bool VurderBytningAfLektion(string ID, int blok,  char type, int fra_col,
                                int fra_row, int til_col, int til_row);
    bool VurderOgBytLektion(string ID, int blok,  char type, int fra_col,
                                  int fra_row, int til_col, int til_row);
};
//---------------------------------------------------------------------------
#endif
