//---------------------------------------------------------------------------
#ifndef skemaH
#define skemaH
//#include "hold_skema.h"  //må under ingen omstændighedder includes
#include "stack.h"
#include "StackData.h"
#include "lektion.h"
#include "Statistik.h"
//---------------------------------------------------------------------------
const int max_col = 5;
const int max_row = 8;
class skema
{
public:
  //public variabel
    string ID;    //indeholder ID'et for ejeren af skemaet
    lektion* skema[max_col][max_row]; //Arrayet indeholder selve skemaet i pointere
  //konstruktører
    skema(string ID_);
    skema();
  //Delete konstruktør
    ~skema();

  //Vurder funktioner
    //Funktionen vurdere om lektionen er tom og returnere en sandhedsværdi for det.
    bool VurderGrund(int col, int row);

	//Funktionen vurdere om den overførte lektion er identisk med lektionen på et
	//givent sted på skemaet. Herefter returneres en sandhedsværdi.
    bool EnsLektion(const lektion& l, int col, int row);

  	//Funktionen vurdere om den overførte lektion i form af attributter er identisk
	//med lektionen på et givent sted på skemaet. Herefter returneres en sandhedsværdi.
    bool EnsLektion(const string& HoldID, const string& FagID, const string& LaererID,
					const string& LokaleID, const int blok, int col, int row);

  //update funktioner
    //Funktionen fjerner en lektion fra skemaet. Den sletter den ikke fra heapen.
    void SletLektion(int col, int row);

    //Funktionen lægger en pointer til en lektion på skemaet i et givent koordinat.
    void LaegLektion(lektion* Lptr, int col, int row);

    //Funktionen bytter 2 pointere på skemaet med hinanden.
    void BytLektioner(int fra_col, int fra_row, int til_col, int til_row);

    //Funktionen flytter 1 pointere på skemaet over til et andet koordinat.
    void FlytLektion(int fra_col, int fra_row, int til_col, int til_row);

  //access funktioner
	//Funktionen returnere en given lektion i et bestemt koordinat via den referede
	//lektion i kaldet. Funktionen giver udtryk for om der en lektion eller ej
	//v.h.a den returnerede sandhedsværdi.
    bool HentLektion(lektion& lPtr, int col, int row);

    //Funktionen laver en kopi af hver lektion over i en ny klasse kaldt
	//"LektionsData", herefter fyldes disse kopier på den overførte stack.
    bool FyldSkemaPaaStack(stack<LektionsData*>& Stack);

  //kontrol funktioner
    //Funktionen kontrollere om der ligger en dobbelt lektion med udgangpunkt i
	//det overførte koordinat. Herefter returneres resultatet som en sandhedsværdi.
    bool ErDobbelt(int col, int row);

    //Funktionen vurdere om skemaet har en tom lektion i det overførte koordinat.
    bool ErTom(int col, int row);

  //Beregnings funktioner
    //Funktionen optæller alle lektioner på skemaet, og returnere dette antal.
    int OptaelAlleLektioner();

    //Funktionen optæller alle mellem lektioner på skemaet, og returnere dette.
    int AntalMellemLektioner();

	//Funktionen beregner og returnere variansen (CV%) af længden af de enkelte dage
	//Helt tomme dage tæller ikke med.!
    double BeregnVarians();

  //Slet funktion
    //Funktionen sletter hele skemaet, hvorunder lektionerne frigives på heapen.
    void SletSkema(int type);

  //udskrivs funktion
    //Funktionen udskriver alle de lektioner som ligger på skemaet.!
    void Udskriv();

protected:
  //Hjælpe funktioner iforbindelse med beregning af varians og mellemlektioner
    //Funktionen vurdere om der er flere lektioner tilbage i en given kolonne.
	//funktionen returnere inddirekte rækken hvor processen stopper!.
    bool FlereLektionerIKolonne(int col, int& row);

    ///Funktionen finder række nummeret på den sidste lektion i en given kolonne.
    int FindSidsteLektion(int col);

  //Private variable

    lektion* dummy;                   //temp pointer til lektion
    LektionsData* StackData;          //Element der bruges til export af skemalektioner
};
#endif

