// Bericht Mindestbestandsunterschreitung
using craftsReport.Interfaces;

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

		public rsp251_xbs()
		{
		}


		// Recompiled
		public bool Execute()
		{
			//  Haupprogrammcode 
			//  Sie sollten mindestens die mit 'TODO' 
			//  gekennzeichneten Stellen nachbearbeiten
			// --------------------------------------------------
			//  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
			//            Dieser ist noch zu vereinbaren
			// --------------------------------------------------
			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("WertNe", "d,8,2");
			HostObject.DefineVariable2("WertNetto", "d,8,2");
			HostObject.DefineVariable2("WertGes", "d,8,2");

			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/6", true);
			HostObject.Set("ZlMax", @"     61", true);

			HostObject.Set("Heute", @"H", true);

			// *******************************************************
			//  Filtervariablen Lagerort und LKZ
			// *******************************************************
			if (!HostObject.IsVar("mLkz"))
				HostObject.DefineVariable2("mLkz", "u,2,0");
			if (!HostObject.IsVar("mOrt"))
				HostObject.DefineVariable2("mOrt", "u,15,0");

			// *******************************************************
			//  MAIN-Datensatz anlegen
			// *******************************************************
			if (!HostObject.IsEmpty("mOrt"))
			{
				if (HostObject.IsEmpty("mLkz"))
					HostObject.DefineRecord("recMAIN", "STAMMPOSITIONEN", 6, 16, HostObject.EvalString(@"J$[mOrt<15]"));
				else
					HostObject.DefineRecord("recMAIN", "STAMMPOSITIONEN", 6, 18, HostObject.EvalString(@"J$[mOrt<15]$[mLkz<2]"));
			}
			else
			{
				if (HostObject.IsEmpty("mLkz"))
					HostObject.DefineRecord("recMAIN", "STAMMPOSITIONEN", 7, 1, HostObject.EvalString(@"J"));
				else
					HostObject.DefineRecord("recMAIN", "STAMMPOSITIONEN", 7, 3, HostObject.EvalString(@"J$[mLkz<2]"));
			}

			// **************************************************
			//  Datensatz EIGENE_ANSCHRIFTEN
			HostObject.DefineRecord("recFSAD", "EIGENE_ANSCHRIFTEN", 0, 2, HostObject.EvalString(@"01"));
			// **************************************************

			//  Erste Seite initialisieren

			HostObject.WriteLine(HostObject.EvalString(@"INITPAGESIZE"));
			HostObject.WriteLine(HostObject.EvalString(@"STARTJOB Preisliste"));
			HostObject.WriteLine(HostObject.EvalString(@"TRANSPARENT"));
			HostObject.WriteLine(HostObject.EvalString(@"STARTPAGE"));
			HostObject.Set("Zeile", @"0", true);
			HostObject.ProcessResource("KopfBericht");
			HostObject.ProcessResource("KopfDetail");

			// --------------------------------------------------
			//  TODO:   Ausgabeschleife aktivieren
			while(!HostObject.TestEof("recMAIN"))
			{
				SUB_loopMAIN();
				HostObject.SkipRecord("recMAIN");
			}

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

			return true;
		}


		bool SUB_loopMAIN()
		{
			//  Wird fuer jeden Satz von recMAIN aufgerufen

			HostObject.VariablesPush();
			if (!HostObject.GetYieldResult(HostObject.EvalString("$[recMAIN.Lkz]/$[recMAIN.Artnr]")))
			{
				HostObject.BreakRecord("recMAIN");
				return HostObject.VariablesPop();
			}

			if (HostObject.EvalBool("$[recMAIN.LAGBEST] >= $[recMAIN.MINBEST]"))
				return HostObject.VariablesPop();

			// **************************************************
			//  Preiseinheit und Mengeneinheit
			HostObject.DefineRecord("recPE", "PREISEINHEITEN", 0, 2, HostObject.EvalString(@"$[recMAIN.PE>2]"));
			HostObject.DefineRecord("recME", "MENGENEINHEITEN", 0, 4, HostObject.EvalString(@"$[recMAIN.EINHEIT>4]"));

			HostObject.DefineVariable2("PrsFak", "d,8,3");
			HostObject.DefineVariable2("EkNe100", "d,8,2");
			HostObject.DefineVariable2("FehlMenge", "d,8,2");
			HostObject.DefineVariable2("BestWert", "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_loop_recNE();
				HostObject.SkipRecord("recNE");
			}

			HostObject.Set("FehlMenge", @" $[recMAIN.MINBEST] - $[recMAIN.LAGBEST] ", true);
			HostObject.Set("BestWert", @"  $[FehlMenge] * (($[recMAIN.EKMAT] / $[PrsFak]) + ($[EkNe100] / 100))", true);

			SUB_CheckPage();
			HostObject.ProcessResource("outMAIN");

			HostObject.Set("WertNetto", @" $[WertNetto] + ($[FehlMenge] * ($[recMAIN.EKMAT] / $[PrsFak]))", true);
			HostObject.Set("WertNe", @"    $[WertNe]    + ($[FehlMenge] * ($[EkNe100] / 100))", true);
			HostObject.Set("WertGes", @"   $[WertNe] + $[WertNetto]", true);

			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_Fuss()
		{
			HostObject.VariablesPush();

			HostObject.Set("Zeile", @"$[ZlMax]", true);
			HostObject.ProcessResource("FussSeite");
			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_Kopf()
		{
			HostObject.VariablesPush();

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

			return HostObject.VariablesPop();
		}

		bool SUB_loop_recNE()
		{
			HostObject.VariablesPush();

			//  TODO: beschreiben Sie hier die Verwendung

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

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

			//  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();
		}
	}
}
