//---------------------------------------------------------------------------
#ifndef SkemaKontrolH
#define SkemaKontrolH
#include <iostream.h>
#include "SkemaListe.h"
#include "lektion.h"
#include "hold_skema.h"
#include "lokale_skema.h"
#include "laerer_skema.h"
//---------------------------------------------------------------------------
//const int max_col = 5;
//const int max_row = 8;
struct SkemaPtr
{
	SkemaPtr(hold_skema* Hskema_ = NULL,
             laerer_skema* Lskema_ = NULL,
             lokale_skema* LOskema_ = NULL);
    void udskriv();

    hold_skema* Hskema;
    laerer_skema* Lskema;
    lokale_skema* LOskema;
};
void SkemaPtr::udskriv()
{
    cout << "\nhold " << Hskema->ID<< " ";
	Hskema->Udskriv();
    cout << "\nlaerer "  << Lskema->ID<< " ";
    Lskema->Udskriv();
    cout << "\nlokale "<< LOskema->ID<< " ";
    LOskema->Udskriv();
}
SkemaPtr::SkemaPtr(hold_skema* Hskema_,laerer_skema* Lskema_, lokale_skema* LOskema_)
{
	Hskema = Hskema_;
    Lskema = Lskema_;
    LOskema = LOskema_;
}

struct koord
{
    koord(int col_, int row_) { col = col_; row = row_; }
    koord() {}
    indsaet(int col_, int row_) { col = col_; row = row_; }
	int col;
    int row;
};
class SkemaKontrol
{
public:
  //konstruktør
    SkemaKontrol(int user_max_col_, int user_max_row_);

  //Byt funktioner
    bool VurderOgBytLektion(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);
    void BytLektion(string ID, char type, int fra_col, int fra_row,
                      int til_col, int til_row);

  //Opret funktioner
    bool OpretSkema(const string& ID, char type);
    bool VurderOgLaegPLektion(string LaererID, int prioritet, int col, int row);

    bool OpretOgLaegLektion(string HoldID, string FagID, string LaererID,
                              string LokaleID, int blok, int col, int row);

  //Hent funktion
    bool HentSkema(const string& ID, stack<LektionsData*>* Stack, char type);
    bool HentNaesteSkema(stack<LektionsData*>& Stack, char type);
    bool HentNaestePSkema(stack<PLektionsData*>& Stack, string& LaererID);
    bool HentPSkema(stack<PLektionsData*>& Stack, const string& LaererID);

  //access funktioner
    AendreGraenser(int col, int row) { user_max_col = col; user_max_row = row; }
    void SletAlt();
    void Reset(char type);
    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);

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

  //Skema Kontrol funktion
    bool KontrollerSkemaer(int& fejl, char type);

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

private:
  //Byt funktioner
	bool BytInitialiser(string ID, int blok, char type, int fra_col,
    					int fra_row, int til_col, int til_row, char form);
    bool BytningAfLektion(const lektion& lPtr1, const lektion& lPtr2,
                            const SkemaPtr& s1, const SkemaPtr& s2,
							const koord& fra, const koord& til,
                            char vType);
    void BytLektion(const lektion& lPtr1, const lektion& lPtr2, const SkemaPtr& s1,
                      const SkemaPtr& s2, const koord& fra, const koord& til);

  //Flyt funktioner
    bool FlytningAfLektion(const lektion& lPtr, const SkemaPtr& s,
								  const koord& fra, const koord& til,
                                  int blok, char vType);
    void FlytLektion(const lektion& lPtr, const SkemaPtr& s, const koord& fra,
                       const koord& til, int blok);

  //Initialiserings funktioner
    bool Initialiser(string ID, lektion& Ptr, SkemaPtr& s, char type, int col, int row, bool& ErTom);
    bool GodkendLektion(const lektion& Ptr, const SkemaPtr& s, int col, int row);

  //Basis funktioner
    void SletLektion(const SkemaPtr& s, const koord& k, int blok);
    void LaegLektion(const lektion& ptr, const SkemaPtr& s,
                           const koord& k, int blok);
    bool HentSkemaPtr(const lektion& ptr);
    bool VurderLektion(const lektion& ptr, const SkemaPtr& s, const koord& k,
                         int blok);
    bool HentLektion(lektion& Ptr, const SkemaPtr& s, const koord& k);

  //alm kontrol funktioner
    bool ErLektionTom(const SkemaPtr& s, const koord& k, int blok);
    bool ErDobbeltLektion(const SkemaPtr& s, const koord& k);

  //Kontrol af Koordinat funktioner
    inline bool KontrollerKoordinat(const int& col, const int& row);
    inline bool KontrollerKoordinat(const koord& k);
    bool KontrollerKoordinat(const koord& k, const int& blok);

  //variable
    SkemaPtr s, s2, s1;
    lektion lPtr, lPtr2;
    koord k, fra, til;
    int user_max_col, user_max_row;
    bool svar;

    SkemaListe<hold_skema> HS;
    SkemaListe<laerer_skema> LS;
    SkemaListe<lokale_skema> LOS;

    int count;
};
  //Flyt funktioner
   /* void FlytLektion(string ID, int blok, char type, int fra_col, int fra_row,
                     int til_col, int til_row);
    bool VurderFlytningAfLektion(string ID, int blok, char type, int fra_col,
                                 int fra_row, int til_col, int til_row);
    bool VurderOgFlytLektion(string ID, int blok, char type, int fra_col,
                             int fra_row, int til_col, int til_row);  */
  //Slet funktion
   // bool VurderOgSletLektion(string ID, int blok, char type, int col, int row);
 /*     bool VurderLaegningAfLektion(string HoldID, string FagID, string LaererID,
							        string LokaleID, int blok, int col, int row);
    bool OpretVurderOgLaegLektion(string HoldID, string FagID, string LaererID,
							  string LokaleID, int blok, int col, int row);   */
#endif
