using craftsReport.Interfaces;

namespace craftsReport.modules
{
	public class rp0310_xbs : IReportModule
	{
		public IReportHost HostObject { set; get; }

		public rp0310_xbs()
		{
		}

		// neuer_Bericht
		public bool Execute()
		{

			// -------------------------------------------------------------------------
			//  Variablen:
			//  Zeile     aktuelle Zeilenummer
			//  ZlMax     Zeile ab der der Fussbereich beginnt
			//  Seite     Seitennummer beginnend mit 1
			//  RandX     linker Rand in cm
			//  RandY     oberer Rand in cm
			//  SizeX     Druckbreite ab Rand links
			//  recMAIN   Datensatz fuer Main-Schleifen
			// --------------------------------------------------------------------------
			HostObject.DefineVariable2("RepTitel", "C,50,0");
			HostObject.DefineVariable2("Zeile", "s,2,0");
			HostObject.DefineVariable2("ZlMax", "s,2,0");
			HostObject.DefineVariable2("Seite", "s,2,0");
			HostObject.DefineVariable2("RandX", "d,8,2");
			HostObject.DefineVariable2("RandY", "d,8,2");
			HostObject.DefineVariable2("SizeX", "d,8,2");
			HostObject.DefineVariable2("Heute", "D,10,0");
			HostObject.DefineVariable2("cyZeile", "d,8,3");
			HostObject.DefineVariable2("mLPI", "s,2,0");

			//  Datensatz EIGENE_ANSCHRIFTEN
			//  dieser Datensatz wird immer gebraucht
			HostObject.DefineRecord("recADR", "EIGENE_ANSCHRIFTEN", 0, 2, HostObject.EvalString(@"01"));

			// -------------------------------------------------------------------------
			//  Prüfen Sie hier die Übergabe von Filtervariablen
			//  Beispiel
			//  IFNOT ISVAR(MeinFilter)
			//     VAR MeinFilter(C,20,0)

			//  Code für den
			//  Berichtsablauf ein.

			SUB_subPaperDefs();
			HostObject.DefineRecord("recMAIN", "KALKULATIONSGRUPPEN", 0, 0, HostObject.EvalString(@""));

			// -----------------------------------------------------------------------------
			//  Vorbereiten der Ausgabe 
			//  Initialisierung der Drucksteuerdaten
			HostObject.WriteLine(HostObject.EvalString(@"INITPAGESIZE"));
			SUB_subJobHeader();
			HostObject.WriteLine(HostObject.EvalString(@"TRANSPARENT"));
			HostObject.WriteLine(HostObject.EvalString(@"STARTPAGE"));
			SUB_subPageOffset();
			HostObject.Set("Zeile", @"0", true);
			HostObject.ProcessResource("KopfBericht");
			HostObject.ProcessResource("KopfDetail");
			// -----------------------------------------------------------------------------

			//  Aufruf des Unterprogramms loopMAIN fuer jeden Datensatz
			//  der an recMAIN gebundenen Tabelle
			while(!HostObject.TestEof("recMAIN"))
			{
				SUB_loopMAIN();
				HostObject.SkipRecord("recMAIN");
			}



			//  ----------------------------------------------------
			//  Druckdatei abschliessen
			HostObject.Set("Zeile", @"$[ZlMax]", true);
			HostObject.ProcessResource("FussBericht");
			HostObject.ProcessResource("outPost");
			HostObject.WriteLine(HostObject.EvalString(@"ENDPAGE"));
			HostObject.WriteLine(HostObject.EvalString(@"ENDJOB"));

			return true;
		}

		bool SUB_Kopf()
		{
			HostObject.VariablesPush();

			//  Dieser Code wird immer beim Seitenwchsel
			//  aufgerufen, um den Kopf der nächsten Seite
			//  auszugeben
			//  Der Kopf für die erste Seite steht jedoch
			//  im Codestück OnPreReport

			HostObject.Set("Zeile", @"0", true);
			HostObject.ProcessResource("KopfSeite");
			HostObject.ProcessResource("KopfDetail");

			return HostObject.VariablesPop();
		}

		bool SUB_Fuss()
		{
			HostObject.VariablesPush();

			//  Dieser Code wird immer beim Seitenwchsel
			//  aufgerufen, um den Fuss der aktuellen Seite
			//  auszugeben
			//  Der Fuss für die letzte Seite steht jedoch
			//  im Codestück OnPostReport

			HostObject.Set("Zeile", @"$[ZlMax]", true);
			HostObject.ProcessResource("FussSeite");
			HostObject.ProcessResource("outPost");
			HostObject.WriteLine(HostObject.EvalString(@"ENDPAGE"));
			HostObject.Set("Seite", @"$[Seite]+1", true);
			HostObject.Set("Zeile", @"0", true);
			HostObject.WriteLine(HostObject.EvalString(@"STARTPAGE"));
			SUB_subPageOffset();

			return HostObject.VariablesPop();
		}


		bool SUB_CheckPage()
		{
			HostObject.VariablesPush();

			//  Fussbereich ausgeben, wenn letzte Zeile erreicht
			if (HostObject.EvalBool("$[Zeile] >= $[ZlMax]"))
				SUB_Fuss();
			//  Kopfbereich ausgeben, wenn erste Zeile erreicht
			if (HostObject.EvalBool("$[Zeile] = 0"))
				SUB_Kopf();

			return HostObject.VariablesPop();
		}

		bool SUB_loopMAIN()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain
			//  Datensatzschleife recMAIN

			//  Fügen Sie hier die Prüfungen für den aktuellen Datensatz ein !
			//  -----------------------------------------------------------------------------

			//  Daten ausgeben
			//  -----------------------------------------------------------------------------
			SUB_CheckPage();
			HostObject.ProcessResource("outMAIN");
			return HostObject.VariablesPop();
		}

		bool SUB_subPaperDefs()
		{
			HostObject.VariablesPush();

			//  Definition des Basislayouts und Papiergrößen

			//  Zeilen per Inc
			HostObject.Set("mLPI", @"8", true);

			HostObject.Set("RepTitel", @"Kalkulationsgruppen", true);
			HostObject.Set("Heute", @"H", true);
			HostObject.Set("RandX", @"      1,80", true);
			HostObject.Set("RandY", @"      0,80", true);
			HostObject.Set("SizeX", @"      17,5", true);
			HostObject.Set("Seite", @"      1", true);
			HostObject.Set("Zeile", @"      0", true);
			HostObject.Set("cyZeile", @"    2.54/$[mLPI]", true);
			HostObject.Set("ZlMax", @"     27.4/$[cyZeile]", true);

			return HostObject.VariablesPop();
		}

		bool SUB_subJobHeader()
		{
			HostObject.VariablesPush();

			//  PDF Options Header
			HostObject.DefineRecord("recPDF", "OPTIONEN", 0, 5, HostObject.EvalString(@"20003"));
			HostObject.DefineVariable2("mJobHead", "C,250,0");

			if (!HostObject.IsVar("mPRJNR"))
				HostObject.DefineVariable2("mPRJNR", "u,8,0");
			if (!HostObject.IsVar("mDESTDEBNR"))
				HostObject.DefineVariable2("mDESTDEBNR", "u,15,0");

			HostObject.Set("mJobHead", @"$[RepTitel]", true);
			if (HostObject.IsEmpty("recPDF.OptDataC"))
				goto DoJobHead;

			if (!HostObject.IsEmpty("mPRJNR"))
				goto MakeJobHead;
			if (!HostObject.IsEmpty("mDESTDEBNR"))
				goto MakeJobHead;

			HostObject.Set("mPRJNR", @"LOSTDOCS", true);
			HostObject.Set("mDESTDEBNR", @"LOSTDOCS", true);

			MakeJobHead:
			HostObject.Set("mJobHead", @"@saPS2PDF-d$[RepTitel]@ @saPS2PDF-c$[recPDF.OptDataC]@ @saPS2PDF-p$[mPRJNR]@ @saPS2PDF-a$[mDESTDEBNR]@", true);

			DoJobHead:
			HostObject.WriteLine(HostObject.EvalString(@"STARTJOB $[mJobHead]"));
			return HostObject.VariablesPop();
		}

		bool SUB_subPageOffset()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain
			HostObject.WriteLine(HostObject.EvalString(@"DEVICE A4Hoch"));
			HostObject.WriteLine(HostObject.EvalString(@"CALCBORDER"));
			HostObject.WriteLine(HostObject.EvalString(@"XOFFSET 0,00"));
			HostObject.WriteLine(HostObject.EvalString(@"YOFFSET 0,00"));



			return HostObject.VariablesPop();
		}
	}
}
