//---------------------------------------------------------------------------
#ifndef KontrolListeH
#define KontrolListeH
#include <conio.h>
#include <cstring.h>
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include "KlyngeListe.h"
#include "SqlKlasse.h"
#include "Portal.h"
#include "comm.h"
//----------------------------------------------------------------------------//
class KontrolListe
{
public:
  //konstruktør
	KontrolListe(Portal* Port_, SqlKlasse* db_,
                 char Kilde_ = 'f', int col = 5, int row = 8,
    			 const string& PlanID_ = "tom", const string& TFF_ = "tom");

  //Gem funktion
    //Funktionen gemmer den liste til databasen som angives ved typen. Det bør
    //bemærkes at funktionen kun kan gemme liste nr 7 og 8.
    bool Gem(int type);

  //Kontrol af HL og LHR listerne
    //Funktionen finder en fag lærer til et hold som mangler en i et bestemt fag.
    //Dette gøres for alle mangelfulde relationer på hold lærer listen.
    bool FindLaererTilHold();

    //Funktionen finder et lokale til et hold som mangler et stamlokale, på
    //lokale hold relationen.
    bool FindLokalerTilHold();

  //Hent funktioner
    //Funktionen finder et egnet lokale til en bestemt lokaletype.
    bool FindLokaleTilLokaleType(string LokaleTypeID, string& LokaleID);

    //Funktionen returnere den næste på lægge listen indenfor den angivne del.
    //Der returneres endvidere en sandhedsværdi for om der er mere at hente.
    bool HentNaestePaLaeggeListen(string& HoldID, string& FagID,
					              string& LaererID, string& LokaleTypeID,
                                  string& LokaleID, int& blok, char del,
                                  int& PlanLagteLektioner);

    //Funktionen henter den næste streng på en given liste (type) i et givent
    //StringSlot nummer.
    bool HentNaeste(string& str, int type, int nr = 0);

    //Funktionen fylder en given type liste på en stack m.h.t ID'er.
    //alt efter udfaldet returneres en sandhedsværdi.
    bool FyldListePaaStack(stack<string>& Stack, char type);

    //Funktionen fylder ID'er fra en given type liste på en stack der returneres.
    stack<string>* FyldListePaaStack(char type);

  //Funktioner til beregning af indekser
    //Funktionen beregner indekset for en given liste, i en bestemt del af lægge listen.
    void BeregnIndex(int type, char del = 's');

  //Funktioner til at tilfoeje lagtelektioner
    //Funktionen opdatere antallet af lagte lektioner på den relation på lægge listen
    //som er forsøgt lagt.
    void OpdaterLagteLektioner(int LagteLektioner, char del);

    //Funktionen beregner alle de lagte lektioner for en bestemt type i enten
    //special lokaletype delen eller stamlokale delen af læggelisten ('b', 's')
    void BeregnLagteLektioner(int type, char del);

  //Indlæs funktion
    //Funktionen indlaeser en liste hvor typen angiver liste nummeret
    bool Indlaes(int type);

  //Optællings funktioner
    int BeregnTotalePlanlagteLektioner();
    int BeregnTotaleLagteLektioner();
    int PlanlagteLektioner(const string ID, char type);

  //Små funktioner
    void SletListe(int type);
    void SorterVvaerdi(char del);
    bool OpdelEfterSpecialLokaler();
    void Reset(int type);
    void AendreStyrke(int Styrke_) { Styrke = Styrke_; }
    void IndsaetPortPtr(Portal* Port_) { Port = Port_; }

  //Udskrivs funktion
	void Udskriv(int type);

private:
  //Funktioner til beregning af indekser
    //Funktionen beregner det endelige indeks for et bestemt objekt på en given
    //liste (type) i en given del af lægge listen.
    void BeregnIndex(data*& dPtr, int type, char del = 's');

  //Funktioner til at tilfoeje lagtelektioner
    //Funktionen henter de lagte lektioner for et bestemt skema ude i planen, og
    //indfører dette herefter på objektet der overføres.
    void TilfoejLagteLektioner(data*& dPtr, int type);

  //Hent funktion
    //Funktionen henter næste objekt på et given liste nummer(type).
    bool HentNaeste(data*& ptr, int type);

  //Små funktioner
    //Funktionen indstiller lægge listen således at "Pejer på" under klynge listen
    //kommer til at pege på den første plads i den del man ønsker at arbejde med.
    //Herefter indstilles den private variabel i, til at pege på den samme plads.
    void ResetOgKlargoer(char del);

  //Sql statements
    //Funktionen Returnere det SQl statement som danner den pågældende liste
    string SQLstatements(int type);

  //private variable
    int Oplads; //opdeling af lægge listen i 2 dele, en i special og en i stam lokaler
    int SL; //Skemalagte lektioner, beregnes udfra col og row's på skemaerne.
    int i; //Benyttes iforbindelse med funktionen resetOgKlargoer. variablen giver udtryk for
    //start værdien når der arbejdes på lægge listen
    char Kilde; //Angiver om der arbejdes med filer eller database ('f' og 'd')
    Klyngeliste<data> Lister[9]; //De 9 lister (omtales nedenfor)
    data obj; //Arbejds objekt af klassen data..
    data *dPtr; //Benyttes til at hente arbejds kopier fra listerne
    SqlKlasse* db; //Objekt af den klasse som varetager kontakten til databasen
    string Navn[9]; //indeholder navnene på de enkelte lister.
    Portal* Port;  //Pointer til potalen.
    string PlanID, TFF, StamLokale;
    stack<string> L;
    stack<string>* Stack;
    stack<string>* HoldListe;
    stack<string>* LaererListe;
    stack<string>* LokaleListe;
    comm comm;
    int Styrke;
};
/*Mapping af de forskellige lister og deres attributter.
-------------------------------
Liste Nummer orden:
-------------------------------
1: HoldListe
2: FagListe
3: LærerListe
4: LokaleTypeListe
5: LokaleListe
6: LæggeListe
7: HoldLokaleRelationsListe
8: HoldLærererRelationsListe
-------------------------------
Mapping af Hold liste (1)
-------------------------------
StringSlot 0: HoldID
IntSlot    0: Antal Planlagte lektioner
IntSlot    1: Antal lagte Lektioner
DoubleSlot 0: L index
-------------------------------
Mapping af FagListe (2)
-------------------------------
StringSlot 0: FagID
StringSlot 1: LokaleTypeID
IntSlot    0: Planlagte Lektioner
IntSlot    1: Antal Hold (optional, benyttes ikke!)
-------------------------------
Mapping af Lærerliste (3)
-------------------------------
StringSlot 0: lærerID
IntSlot    0: PlanlagteLektioner
IntSlot    1: LagteLektioner +Prioriterede lektioner
DoubleSlot 0: L index
-------------------------------
Mapping af LokaleTypeListe (4)
-------------------------------
StringSlot 0: LokaleTypeID
IntSlot    0: Antal lokaler (benyttes til at beregne skemalagte lektioner (SL))
IntSlot    1: Planlagte Lektioner
IntSlot    2: LagteLektioner
DoubleSlot 0: Specielt LO index
-------------------------------
Mapping af LokaleListe (5)
-------------------------------
StringSlot 0: LokaleID
StringSlot 1: LokaleTypeID
IntSlot    0: PlanlagteLektioner
intSlot    1: LagteLektioner
DoubleSlot 0: Lo index
d          0: Peger på LokaleType objekt i 4.
-------------------------------
Mapping af LæggeListe (6)
-------------------------------
StringSlot 0: HoldID
StringSlot 1: FagID
StringSlot 2: lærerID
StringSlot 3: LokaleTypeID
StringSlot 4: LokaleID
IntSlot    0: BlokSize (lektions størrelse bestemt af læren)
intSlot    1: Antal Lagte Faglektioner
intSlot    2: Antallet af gange Relationen er forsøgt lagt.
DoubleSlot 0: F index
DoubleSlot 1: V index
d          0: Peger på Hold objekt på liste 1
d          1: Peger på Fag objekt på liste 2
d          2: Peger på lærer objekt på liste 3
d          3: Peger på Lokaletype objekt på liste 4
d          4: Peger på Lokale objekt på liste 5
-------------------------------
Mapping af LokaleHold liste (7)
-------------------------------
StringSlot 0: holdID
StringSlot 1: LokaleID
-------------------------------
Mapping af HoldLærer listen (8)
-------------------------------
StringSlot 0: holdID
StringSlot 1: FagID
StringSlot 2: LærerID
-------------------------------
Mapping af lærerFag profil listen (9)
-------------------------------
StringSlot 0: lærerID
StringSlot 1: FagID
IntSlot    0: antal hold
-------------------------------
*/
#endif

