//---------------------------------------------------------------------------
#pragma hdrstop
#include "Edderkop.h"
//---------------------------Valg af plan funktion----------------------------//
///Funktionen indlæser en givent plan bestemt udfra planID'et.
bool Edderkop::VaelgPlan(const string PlanID)
{
    if(PlanPtr->VaelgPlan(PlanID, TFF, col, row))
    {
      PortalPtr = new Portal(PlanID, col, row, Kilde);
      KontrolListePtr = new KontrolListe(PortalPtr, db, Kilde, col, row, PlanID, TFF);
      GeneratorPtr = new Generator(KontrolListePtr, PortalPtr, col, row, Kilde);

      //Lokale hold relationen indlæses da den
      //skal bruges til at lave lokale listen..!
      if(KontrolListePtr->Indlaes(7) && KontrolListePtr->Indlaes(1) &&
         KontrolListePtr->Indlaes(2) && KontrolListePtr->Indlaes(3) &&
         KontrolListePtr->Indlaes(4) && KontrolListePtr->Indlaes(5))
      {
    	HoldListe = KontrolListePtr->FyldListePaaStack('h');
        LaererListe = KontrolListePtr->FyldListePaaStack('l');
        LokaleListe = KontrolListePtr->FyldListePaaStack('k');
        PortalPtr->Initialisering(HoldListe, LaererListe, LokaleListe);

        PortalPtr->KlargoerOgHentSkemaer();
        return true;
      }
      else
        comm.FejlBox("Fejl ved indlæsning af db lister");
    }
    else
      comm.FejlBox("Planen findes ikke!");
    return false;
}//
//-----------------------Hente funktioner-------------------------------------//
///Initialiserings funktion til at starte hentningen af alle planID'er.
bool Edderkop::StartHentningAfPlanListe()
{
    return PlanPtr->HentListeOverPlaner(PlanListe);
}//
///Funktionen henter det næste PLan ID på listen.
bool Edderkop::HentNaestePlanID(string& ID)
{
    if(!PlanListe.tom())
    {
      ID = PlanListe.pop();
      return true;
    }
    return false;
}//
///Initialisings funktion til at starte hentningen af en given liste.
void Edderkop::StartHentningAfListe(char type)
{
	KontrolListePtr->FyldListePaaStack(*Liste, type);
}//
///Funktionen henter det næste ID på listen, initialiseret i ovenfor funktion.
bool Edderkop::HentNaestePaaListen(string& ID)
{
	if(!Liste->tom())
    {
      ID = Liste->pop();
      return true;
    }
    return false;
}//
///Initialiserings funktion til at starte hentningen af et givent skema.
bool Edderkop::StartHentningAfSkema(const string ID, char type)
{
    comm << "henter skema";
    comm << type;
    comm << ID;
    return PortalPtr->HentSkema(ID, Skema, type);
}//
///FUnktionen henter den næste lektion på stacken, fyldt i forrige lektion.
bool Edderkop::HentNaesteLektion(string& HoldID, string& FagID,
                                 string& LaererID, string& LokaleID,
                                 int& col, int& row)
{
    if(!Skema->tom())
    {
      Lektion = Skema->pop();
      HoldID = Lektion->HoldID; comm << HoldID;
      FagID = Lektion->FagID;
      LaererID = Lektion->LaererID;
      LokaleID = Lektion->LokaleID;
      col = Lektion->col;
      row = Lektion->row;
      delete Lektion;
      return true;
    }
    return false;
}//
//-------------------------speciel Gem og slet funktion-----------------------//
///Funktionen gemmer de 3 skematyper til hver sin fil.
void Edderkop::GemTilFil()
{
    PortalPtr->GemSkemaerPaaFil('h');
    PortalPtr->GemSkemaerPaaFil('l');
    PortalPtr->GemSkemaerPaaFil('k');
}//
///Funktionen sletter alle vigtige lister der bliver indlæst iforbindelse med
///genereringen.
void Edderkop::Slet()
{
	KontrolListePtr->SletListe(6);
    KontrolListePtr->SletListe(8);
    KontrolListePtr->SletListe(9);
    PortalPtr->SletAlt();
}//
//----------------------------------------------------------------------------//
//-------------------------Skin funktioner------------------------------------//
//----------------------------------------------------------------------------//
//basis funktioner.
void Edderkop::Gem()
{
	PortalPtr->GemSkemaer();
}
bool Edderkop::StartGenerering(int frekvens, int styrke, int col, int row, int type,
                               bool Skrivebeskyttet)
{
	return GeneratorPtr->Generer(frekvens, styrke, col, row, type, Skrivebeskyttet);
}
bool Edderkop::PrintSkema(const string& ID, char type)
{
	return PortalPtr->PrintSkema(ID, type);
}
//OPtællings/beregnings funktioner
double Edderkop::VariansFor(string& ID, char type)
{
	return PortalPtr->BeregnVariansFor(ID, type);
}
int Edderkop::LagteLektioner(string& ID, char type)
{
	return PortalPtr->SkemalagteLektioner(ID, type);
}
int Edderkop::PlanlagteLektioner(const string& ID, char type)
{
	return KontrolListePtr->PlanlagteLektioner(ID, type);
}
int Edderkop::BeregnTotalePlanlagteLektioner()
{
	return KontrolListePtr->BeregnTotalePlanlagteLektioner();
}
int Edderkop::BeregnTotaleLagteLektioner()
{
	return PortalPtr->BeregnTotaleLagteLektioner();
}
int Edderkop::AntalMellemLektioner()
{
	return PortalPtr->AntalMellemLektioner();
}
//----------------------------------------------------------------------------//
///Konstruktør
Edderkop::Edderkop(char Kilde_, int Version_)
{
	Kilde = Kilde_;
    PlanPtr = new Plan(Kilde);
    db = new SqlKlasse(Kilde);
    Skema = new stack<LektionsData*>;
    Liste = new stack<string>;
}//
///Destructor.
Edderkop::~Edderkop()
{
	delete PlanPtr;
    delete db;
    delete PortalPtr;
    delete KontrolListePtr;
    delete GeneratorPtr;
}//
//----------------------------------------------------------------------------//
