using craftsReport.Interfaces;

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

		public rsp210_xbs()
		{
		}

		// Telefonliste
		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
			HostObject.DefineRecord("recADR", "EIGENE_ANSCHRIFTEN", 0, 2, HostObject.EvalString(@"01"));

			//  Firmenstammdaten auf Mittellohn positionieren
			HostObject.DefineRecord("recMLOHN", "OPTIONEN", 0, 5, HostObject.EvalString(@" 7006"));

			//  Firmenstammdaten auf Umsatzsteuersatz 1 positionieren
			HostObject.DefineRecord("recUST1", "OPTIONEN", 0, 5, HostObject.EvalString(@" 7003"));

			// -------------------------------------------------------------------------
			//  Prüfen der Übergabe von Filtervariablen

			if (!HostObject.IsVar("mOrder"))
				HostObject.DefineVariable2("mOrder", "L,1,0");
			if (!HostObject.IsVar("VonArtNr"))
				HostObject.DefineVariable2("VonArtNr", "u,20,0");
			if (!HostObject.IsVar("BisArtNr"))
				HostObject.DefineVariable2("BisArtNr", "u,20,0");
			if (!HostObject.IsVar("VonSuch"))
				HostObject.DefineVariable2("VonSuch", "u,15,0");
			if (!HostObject.IsVar("BisSuch"))
				HostObject.DefineVariable2("BisSuch", "u,15,0");
			if (!HostObject.IsVar("VonWg"))
				HostObject.DefineVariable2("VonWg", "u,6,0");
			if (!HostObject.IsVar("BisWg"))
				HostObject.DefineVariable2("BisWg", "u,6,0");

			// ==== Check-passendes Filter
			if (HostObject.EvalBool("$[mOrder]"))
				goto OnPreExit1;

			if (!HostObject.IsEmpty("VonArtNr"))
				goto OnPreExit;
			if (!HostObject.IsEmpty("BisArtNr"))
				goto OnPreExit;
			if (!HostObject.YesNo(HostObject.EvalString("Sie haben kein Atikelnummern-Filter angegeben. Wollen Sie trotzdem fortsetzen ?")))
				return true;
			goto OnPreExit;

			OnPreExit1:
			if (!HostObject.IsEmpty("VonSuch"))
				goto OnPreExit;
			if (!HostObject.IsEmpty("BisSuch"))
				goto OnPreExit;
			if (!HostObject.YesNo(HostObject.EvalString("Sie haben kein Matchcode-Filter angegeben. Wollen Sie trotzdem fortsetzen ?")))
				return true;

			OnPreExit:

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

			SUB_subPaperDefs();

			// ==== :Kond_CC9D Bedingungscode Filter ArtikelNr oder Suchen
			if (HostObject.EvalBool("($[mOrder]) = (1)"))
				goto Kond_CC9D_if;
			else
				goto Kond_CC9D_else;
			// ==== :Kond_CC9D IF-Zweig
			Kond_CC9D_if:
			//  TODO Code eintragen

			HostObject.DefineRecord("recMAIN", "STAMMPOSITIONEN", 1, 0, HostObject.EvalString(@""));
			if (!HostObject.IsEmpty("VonSuch"))
				HostObject.FindRecord("recMain", HostObject.EvalString("$[VonSuch]"));

			goto Kond_CC9D_end;
			// ==== :Kond_CC9D ELSE-Zweig
			Kond_CC9D_else:
			//  TODO Code eintragen

			HostObject.DefineRecord("recMAIN", "STAMMPOSITIONEN", 0, 0, HostObject.EvalString(@""));
			if (!HostObject.IsEmpty("VonArtNr"))
				HostObject.FindRecord("recMain", HostObject.EvalString("$[VonArtNr]"));

			goto Kond_CC9D_end;
			// ==== :Kond_CC9D Ende
			Kond_CC9D_end:

			// -----------------------------------------------------------------------------
			//  Vorbereiten der Ausgabe 
			//  Initialisierung der Drucksteuerdaten
			HostObject.WriteLine(HostObject.EvalString(@"INITPAGESIZE"));
			HostObject.WriteLine(HostObject.EvalString(@"STARTJOB $[RepTitel]"));
			HostObject.WriteLine(HostObject.EvalString(@"TRANSPARENT"));
			HostObject.WriteLine(HostObject.EvalString(@"STARTPAGE"));
			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"));

			return HostObject.VariablesPop();
		}

		bool SUB_CheckPage()
		{
			HostObject.VariablesPush();

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

			return HostObject.VariablesPop();
		}

		bool SUB_looprecNE()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain/loopMAIN
			//  Datensatzschleife recNE

			HostObject.DefineVariable2("NePrs", "d,8,6");

			HostObject.DefineRecord("recFSNE", "NICHTEISENDATEN", 0, 2, HostObject.EvalString(@"$[recNE.NEKZ<2]"));
			if (HostObject.TestEof("recFSNE"))
				return HostObject.VariablesPop();

			//  Preis je 1 Kg
			HostObject.Set("NePrs", @"($[recFSNE.TAGESPREIS]/$[recFSNE.KGJEPREIS])-($[recNE.BASISPREIS]/$[recNE.KGJEBASIS])", true);
			HostObject.Set("NePrs", @"(100 * ($[NePrs] * $[recNE.GEWICHT])) / $[recNE.GEBINDE]", true);
			HostObject.Set("EkNe100", @"$[EkNe100]+$[NePrs]", true);

			return HostObject.VariablesPop();
		}

		bool SUB_loopMAIN()
		{
			HostObject.VariablesPush();

			//  Unterprogramm von ReportMain
			//  Datensatzschleife recMAIN

			if (HostObject.GetYieldResult(HostObject.EvalString("$[recMAIN.Lkz]/$[recMAIN.Artnr]")))
				goto NoBreak;
			HostObject.BreakRecord("recMAIN");
			return HostObject.VariablesPop();
			NoBreak:

			// ********* Filter von-Artikelnr
			if (HostObject.IsEmpty("VonArtNr"))
				goto NoVonNr;
			if (!HostObject.CompareString("VonArtNr", ">", HostObject.EvalString(@"$[recMAIN.LKZ<2]$[recMAIN.ARTNR<18]")))
				goto NoVonNr;
			return HostObject.VariablesPop();
			NoVonNr:

			// ********* Filter bis-Artikelnr
			if (HostObject.IsEmpty("BisArtNr"))
				goto NoBisNr;
			if (!HostObject.CompareString("BisArtNr", "<", HostObject.EvalString(@"$[recMAIN.LKZ<2]$[recMAIN.ARTNR<18]")))
				goto NoBisNr;
			if (!HostObject.EvalBool("$[mOrder]"))
				HostObject.BreakRecord("recMAIN");
			return HostObject.VariablesPop();
			NoBisNr:

			// ********* Filter von-Suchen
			if (HostObject.IsEmpty("VonSuch"))
				goto NoVonSuch;
			if (!HostObject.CompareString("VonSuch", ">", HostObject.EvalString(@"$[recMAIN.SUCHEN<15]")))
				goto NoVonSuch;
			return HostObject.VariablesPop();
			NoVonSuch:

			// ********* Filter bis-Suchen
			if (HostObject.IsEmpty("BisSuch"))
				goto NoBisSuch;
			if (!HostObject.CompareString("BisSuch", "<", HostObject.EvalString(@"$[recMAIN.SUCHEN<15]")))
				goto NoBisSuch;
			if (HostObject.EvalBool("$[mOrder]"))
				HostObject.BreakRecord("recMAIN");
			return HostObject.VariablesPop();
			NoBisSuch:

			// ********* Filter von-Wg
			if (HostObject.IsEmpty("VonWg"))
				goto NoVonWg;
			if (!HostObject.CompareString("VonWg", ">", HostObject.EvalString(@"$[recMAIN.WARGRU<6]")))
				goto NoVonWg;
			return HostObject.VariablesPop();
			NoVonWg:

			// ********* Filter bis-Wg
			if (HostObject.IsEmpty("BisWg"))
				goto NoBisWg;
			if (!HostObject.CompareString("BisWg", "<", HostObject.EvalString(@"$[recMAIN.WARGRU<6]")))
				goto NoBisWg;
			return HostObject.VariablesPop();
			NoBisWg:

			// **************************************************
			//  Datensatzschleife PREISEINHEITEN
			HostObject.DefineRecord("recPE", "PREISEINHEITEN", 0, 2, HostObject.EvalString(@"$[recMAIN.PE>2]"));
			if (HostObject.TestEof("recPE"))
				goto EOF_recPE;
			EOF_recPE:
			// **************************************************
			// **************************************************
			//  Datensatzschleife MENGENEINHEITEN
			HostObject.DefineRecord("recME", "MENGENEINHEITEN", 0, 4, HostObject.EvalString(@"$[recMAIN.EINHEIT>4]"));
			if (HostObject.TestEof("recME"))
				goto EOF_recME;
			EOF_recME:
			// **************************************************
			// **************************************************
			//  Datensatzschleife KALKULATIONSGRUPPEN
			HostObject.DefineRecord("recKGL", "KALKULATIONSGRUPPEN", 0, 2, HostObject.EvalString(@"$[recMAIN.KGLOHN>2]"));
			if (HostObject.TestEof("recKGL"))
				goto EOF_recKGL;
			EOF_recKGL:
			// **************************************************
			// **************************************************
			//  Datensatzschleife KALKULATIONSGRUPPEN
			HostObject.DefineRecord("recKGM", "KALKULATIONSGRUPPEN", 0, 2, HostObject.EvalString(@"$[recMAIN.KGMAT>2]"));
			if (HostObject.TestEof("recKGM"))
				goto EOF_recKGM;
			EOF_recKGM:
			// **************************************************


			HostObject.DefineVariable2("PrsFak", "d,8,3");
			HostObject.DefineVariable2("VkMat1", "d,8,2");
			HostObject.DefineVariable2("VkLohn1", "d,8,2");
			HostObject.DefineVariable2("VkGes1", "d,8,2");
			HostObject.DefineVariable2("EkJe1", "d,8,2");
			HostObject.DefineVariable2("EkNe100", "d,8,2");
			HostObject.DefineVariable2("Vk2MincMwst", "d,8,2");

			HostObject.Set("PrsFak", @"$[recPE.FAKTOR]*$[recMAIN.GEBINDE]", true);
			if (HostObject.EvalBool("0=$[PrsFak]"))
				HostObject.Set("PrsFak", @"1", true);

			HostObject.DefineRecord("recNE", "NEZUSCHLAEGE", 0, 20, HostObject.EvalString(@"$[recMAIN.LKZ<2]$[recMAIN.ARTNR<18]"));
			if (HostObject.EvalBool("$[recMAIN.NEANTEIL]"))
				while(!HostObject.TestEof("recNE"))
			{
				SUB_looprecNE();
				HostObject.SkipRecord("recNE");
			}
			// NoNe:

			HostObject.Set("EkJe1", @"   ($[recMAIN.EKMAT]/$[PrsFak])+$[recMAIN.ZUBEHOERDM]+($[EkNe100]/100)+0.005", true);
			HostObject.Set("VkMat1", @"  $[EkJe1] * (1 + ($[recKGM.VHMAT]/100))", true);
			HostObject.Set("VkLohn1", @" ($[recMAIN.ZEIT] * $[recMLOHN.OPTDATAD]) * (1 + ($[recKGL.VHLOHN]/100))", true);
			HostObject.Set("VkGes1", @"  $[VkLohn1]+$[VkMat1]", true);
			HostObject.Set("Vk2MincMwst", @" $[recMAIN.VKM2] * ((100 + $[recUST1.OPTDATAD]) / 100)", true);

			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", @"Preisliste", true);
			HostObject.Set("Heute", @"H", true);
			HostObject.Set("RandX", @"      1,80", true);
			HostObject.Set("RandY", @"      0,80", true);
			HostObject.Set("SizeX", @"      18,0", true);
			HostObject.Set("Seite", @"      1", true);
			HostObject.Set("Zeile", @"      0", true);
			HostObject.Set("cyZeile", @"    2.54/$[mLPI]", true);
			HostObject.Set("ZlMax", @"     26.5/$[cyZeile]", true);

			return HostObject.VariablesPop();
		}
	}
}
