using craftsReport.Interfaces;

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

		public rdn150_xbs()
		{
		}

		// Recompiled
		public bool Execute()
		{

			HostObject.DefineVariable2("ReportTitel", "C,40,0");
			HostObject.Set("ReportTitel", @"$[mp_Titel]", true);

			//  * Artikel sortiert nach Lkz+Warengruppe 
			HostObject.DefineRecord("Teil", "STAMMPOSITIONEN", 3, 2, HostObject.EvalString(@"$[KeyLkz<2]"));
			HostObject.DefineRecord("FsPe", "PREISEINHEITEN", 0, 0, HostObject.EvalString(@""));
			HostObject.DefineRecord("FsMe", "MENGENEINHEITEN", 0, 0, HostObject.EvalString(@""));

			HostObject.DefineVariable2("Charset", "C,10,0");
			HostObject.DefineVariable2("Zeile", "N,8,0");
			HostObject.DefineVariable2("DoCase", "u,3,0");

			HostObject.DefineVariable2("mWgVon", "C,8,0");
			HostObject.DefineVariable2("mWgBis", "C,8,0");
			HostObject.DefineVariable2("mWgTmp", "C,8,0");
			HostObject.Set("mWgVon", @"N$[KeyVonWrg<6]N", true);
			HostObject.Set("mWgBis", @"N$[KeyBisWrg<6]N", true);

			HostObject.Set("Charset", @"OEM", true);
			HostObject.Set("Zeile", @"0", true);

			if (!HostObject.IsEmpty("KeyVonWrg"))
				HostObject.FindRecord("Teil", HostObject.EvalString("$[KeyVonWrg<6]"));

			SUB_OutV();
			while(!HostObject.TestEof("Teil"))
			{
				SUB_TeilLoop();
				HostObject.SkipRecord("Teil");
			}
			SUB_OutE();




			return true;
		}

		bool SUB_TeilLoop()
		{
			HostObject.VariablesPush();

			//  ==================================================
			//  Abfrage Abbruch durch Bediener
			if (HostObject.GetYieldResult(HostObject.EvalString("$[Teil.Lkz]/$[Teil.Artnr]")))
				goto DoVonWrg;
			HostObject.BreakRecord("Teil");
			return HostObject.VariablesPop();

			//  ==================================================
			//  Abfrage der Bedingung Von/Bis-Warengruppe

			DoVonWrg:
			HostObject.Set("mWgTmp", @"N$[Teil.Wargru<6]N", true);
			if (HostObject.IsEmpty("KeyVonWrg"))
				goto DoBisWrg;
			if (HostObject.CompareString("mWgTmp", "<", HostObject.EvalString(@"$[mWgVon<8]")))
				return HostObject.VariablesPop();

			DoBisWrg:
			HostObject.Set("mWgTmp", @"N$[Teil.Wargru<6]N", true);
			if (HostObject.IsEmpty("KeyBisWrg"))
				goto DoIt;
			if (!HostObject.CompareString("mWgTmp", ">", HostObject.EvalString(@"$[mWgBis<8]")))
				goto DoIt;

			HostObject.BreakRecord("Teil");
			return HostObject.VariablesPop();

			DoIt:

			//  ========================================================
			//  Preis und Preiseinheit normalisieren
			//  Lockup nach Mengeneinheit
			HostObject.DefineVariable2("mPe", "N,12,0");
			HostObject.DefineVariable2("mPrsFakt", "N,14,3");
			HostObject.DefineVariable2("mPreis", "N,12,0");
			HostObject.DefineVariable2("mRab1", "N,6,0");
			HostObject.DefineVariable2("mRab2", "N,6,0");
			HostObject.DefineVariable2("mMe", "C,6,0");
			HostObject.DefineVariable2("mRABGRU", "C,4,0");
			HostObject.DefineVariable2("mWARGRU", "C,3,0");
			HostObject.DefineVariable2("mTXTNR", "C,18,0");

			HostObject.Set("mPrsFakt", @"$[Teil.Gebinde]", true);
			HostObject.Set("mPreis", @"$[Teil.BRUTTOEK] * 100", true);
			HostObject.Set("mRab1", @"$[Teil.RABATT1] * 100", true);
			HostObject.Set("mRab2", @"$[Teil.RABATT1] * 100", true);
			HostObject.Set("mPe", @"0", true);
			HostObject.Set("mRABGRU", @"$[Teil.RABGRU]", true);
			HostObject.Set("mWARGRU", @"$[Teil.WARGRU]", true);
			HostObject.Set("mTXTNR", @"$[Teil.TEXTNR]", true);

			HostObject.FindRecord("FsPe", HostObject.EvalString("$[Teil.Pe>2]"));
			HostObject.FindRecord("FsMe", HostObject.EvalString("$[Teil.Einheit>4]"));

			if (!HostObject.TestEof("FsMe"))
				HostObject.Set("mMe", @"$[FsMe.NAME] ", true);
			if (HostObject.EvalBool("$[mPrsFakt]<=0"))
				HostObject.Set("mPrsFakt", @"1", true);
			if (!HostObject.TestEof("FsPe"))
				HostObject.Set("mPrsFakt", @" $[mPrsFakt] * $[FsPe.Faktor]", true);

			//  * Preiseinheit kalkulieren
			if (HostObject.EvalBool(" ($[mPrsFakt]<>1) & ($[mPrsFakt]<>10) & ($[mPrsFakt]<>100)  & ($[mPrsFakt]<>1000) "))
				goto DivPrs;
			if (HostObject.EvalBool(" $[mPrsFakt]=10 "))
				HostObject.Set("mPe", @"1", true);
			if (HostObject.EvalBool(" $[mPrsFakt]=100 "))
				HostObject.Set("mPe", @"2", true);
			if (HostObject.EvalBool(" $[mPrsFakt]=1000 "))
				HostObject.Set("mPe", @"3", true);
			goto DoCase;

			DivPrs:
			HostObject.Set("mPreis", @"$[mPreis] / $[mPrsFakt]  ", true);

			DoCase:
			//  * ========================================================
			//  * Verzweigung auf verschiedene Ausgaben
			if (HostObject.CompareString("DoCase", "=", HostObject.EvalString(@"101")))
				goto Do101;
			if (HostObject.CompareString("DoCase", "=", HostObject.EvalString(@"102")))
				goto Do102;
			if (HostObject.CompareString("DoCase", "=", HostObject.EvalString(@"104")))
				goto Do104;
			if (HostObject.CompareString("DoCase", "=", HostObject.EvalString(@"190")))
				goto Do190;
			return HostObject.VariablesPop();

			//  * =================== Artikelgrunddaten und Dimensionstext
			Do101:
			SUB_OutA();
			SUB_OutB();
			return HostObject.VariablesPop();

			//  * ======================= Artikelpreise und Preiseinheiten
			Do102:
			SUB_OutP();
			return HostObject.VariablesPop();

			//  * ============================ Montagezeiten nach C-Saetze
			Do104:
			if (HostObject.CompareString("Teil.KZPOS", "=", HostObject.EvalString(@"A")))
				return HostObject.VariablesPop();
			if (HostObject.EvalBool(" $[Teil.ZEIT] > 0 "))
				SUB_OutC();
			return HostObject.VariablesPop();

			//  * ============================ Zubehoerverweise als C-Satz
			Do190:
			HostObject.DefineRecord("Zube", "KLEINTEILE", 0, 20, HostObject.EvalString(@"$[Teil.LKZ<2]$[Teil.ARTNR<18]"));
			while(!HostObject.TestEof("Zube"))
			{
				SUB_ZubeLoop();
				HostObject.SkipRecord("Zube");
			}
			return HostObject.VariablesPop();
		}

		bool SUB_OutA()
		{
			HostObject.VariablesPush();

			if (HostObject.EvalBool("$[Teil.TEXTKZ]=2"))
				HostObject.Set("mTXTNR", @"", true);

			HostObject.WriteLine(HostObject.EvalString(@"A;N;$[Teil.ARTNR];$[Teil.KZDRK1]0;$[Teil.BEZ1];$[Teil.MERKMAL];1;$[mPe];$[mMe];$[mPreis];$[mRABGRU];$[mWARGRU];$[mTXTNR];"));

			return HostObject.VariablesPop();
		}

		bool SUB_OutB()
		{
			HostObject.VariablesPush();

			HostObject.DefineVariable2("mXWG", "C,7,0");
			HostObject.DefineVariable2("mFLT", "C,20,0");
			HostObject.Set("mXWG", @"$[Teil.WARGRU<6]!", true);
			HostObject.Set("mXWG", @"$[mXWG>4]", true);
			HostObject.Set("mXWG", @"$[mXWG<3]", true);
			HostObject.WriteLine(HostObject.EvalString(@"B;N;$[Teil.ARTNR];$[Teil.SUCHEN];$[Teil.BSTNR];$[Teil.KATALOGSEI];;;;$[Teil.EANCODE];;$[mXWG];;;;;"));

			//  * Dimensionstexte anschliessen
			HostObject.DefineVariable2("DimZeile", "N,3,0");
			HostObject.Set("DimZeile", @"1", true);

			//  * Langtext ist privat, dann als Dimension ausgeben
			if (HostObject.EvalBool("$[Teil.TEXTKZ]<>2"))
				goto EndPrivat;
			HostObject.Set("mFLT", @"$[Teil.LKZ<2]$[Teil.ARTNR<18]", true);
			HostObject.DefineRecord("TextP", "LANGTEXTZEILEN", 0, 22, HostObject.EvalString(@"13$[mFLT<20]"));
			while(!HostObject.TestEof("TextP"))
			{
				SUB_DimT02Loop();
				HostObject.SkipRecord("TextP");
			}
			EndPrivat:

			//  * Dimensionstext  
			HostObject.Set("mFLT", @"$[Teil.LKZ<2]$[Teil.ARTNR<18]", true);
			HostObject.DefineRecord("DimT", "DIMENSIONSTEXTE", 0, 20, HostObject.EvalString(@"$[mFLT<20]"));
			while(!HostObject.TestEof("DimT"))
			{
				SUB_DimT01Loop();
				HostObject.SkipRecord("DimT");
			}

			//  * Ausgabe Nichteisengewichte 
			if (!HostObject.EvalBool("$[Teil.NEANTEIL]"))
				return HostObject.VariablesPop();

			HostObject.DefineVariable2("mLfdNrNe", "N,2,0");
			HostObject.Set("mLfdNrNe", @"1", true);
			HostObject.Set("mFLT", @"$[Teil.LKZ<2]$[Teil.ARTNR<18]", true);
			HostObject.DefineRecord("NeZu", "NEZUSCHLAEGE", 0, 20, HostObject.EvalString(@"$[mFLT<20]"));
			while(!HostObject.TestEof("NeZu"))
			{
				SUB_NeLoop();
				HostObject.SkipRecord("NeZu");
			}

			return HostObject.VariablesPop();
		}

		bool SUB_DimT01Loop()
		{
			HostObject.VariablesPush();

			if (HostObject.EvalBool("$[DimZeile]>99"))
				return HostObject.VariablesPop();
			if (HostObject.CompareString("DimT.KENNUNG", "=", HostObject.EvalString(@"F")))
				goto OutPut;
			if (HostObject.CompareString("DimT.KENNUNG", "=", HostObject.EvalString(@"T")))
				goto OutPut;
			if (HostObject.CompareString("DimT.KENNUNG", "=", HostObject.EvalString(@"E")))
				goto OutPut;
			return HostObject.VariablesPop();

			OutPut:
			HostObject.WriteLine(HostObject.EvalString(@"D;N;$[DimT.ARTNR];$[DimZeile];$[DimT.KENNUNG];$[DimT.TEXTNR];$[DimT.TEXTZEILE];;;;;"));
			HostObject.Set("DimZeile", @"$[DimZeile]+1", true);

			return HostObject.VariablesPop();
		}

		bool SUB_DimT02Loop()
		{
			HostObject.VariablesPush();

			if (HostObject.EvalBool("$[DimZeile]>99"))
				return HostObject.VariablesPop();

			HostObject.WriteLine(HostObject.EvalString(@"D;N;$[Teil.ARTNR];$[DimZeile];F;;$[TextP.DATEN];;;;;"));
			HostObject.Set("DimZeile", @"$[DimZeile]+1", true);

			return HostObject.VariablesPop();
		}

		bool SUB_ZubeLoop()
		{
			HostObject.VariablesPush();

			HostObject.DefineVariable2("ZbMenge", "N,10,0");
			HostObject.Set("ZbMenge", @"1000 * $[Zube.REFMENGE]", true);
			HostObject.WriteLine(HostObject.EvalString(@"C;N;ZUBEHOER;$[Teil.ARTNR];$[Zube.LFDNR];$[ZbMenge];$[Zube.REFARTNR];$[Zube.REFLKZ];"));

			return HostObject.VariablesPop();
		}

		bool SUB_OutC()
		{
			HostObject.VariablesPush();

			HostObject.DefineVariable2("mZeit", "N,8,0");
			HostObject.Set("mZeit", @"10 * $[Teil.ZEIT]", true);
			HostObject.Set("Zeile", @"$[Zeile]+1", true);
			HostObject.WriteLine(HostObject.EvalString(@"C;N;ARBEIT-1;$[Teil.ARTNR];2;2;$[mZeit];"));
			//  *V50 OUT C;N;ARBA;$[Teil.ARTNR];2;2;$[mZeit];

			return HostObject.VariablesPop();
		}

		bool SUB_OutP()
		{
			HostObject.VariablesPush();

			HostObject.WriteLine(HostObject.EvalString(@"P;A;$[Teil.ARTNR];1;$[mPreis];1;$[mRab1];1;$[mRab2];;;;;;;;;;;;"));

			return HostObject.VariablesPop();
		}

		bool SUB_NeLoop()
		{
			HostObject.VariablesPush();

			HostObject.DefineVariable2("BasPrs", "N,10,0");
			HostObject.DefineVariable2("BasFak", "N,10,0");
			HostObject.DefineVariable2("Gewicht", "N,10,0");
			HostObject.DefineVariable2("GewFak", "N,10,0");

			HostObject.Set("BasPrs", @"100  * $[NeZu.BASISPREIS]", true);
			HostObject.Set("BasFak", @"1000 / $[NeZu.KGJEBASIS]", true);
			HostObject.Set("Gewicht", @"100 *$[NeZu.Gewicht]", true);
			HostObject.Set("GewFak", @"(1000 * $[mPrsFakt]) / $[NeZu.Gebinde]", true);
			HostObject.WriteLine(HostObject.EvalString(@"Z;N;$[Teil.ARTNR];$[mLfdNrNe];4;$[NeZu.NEKZ];$[BasPrs];$[BasFak];$[Gewicht];$[GewFak]"));
			HostObject.Set("mLfdNrNe", @"$[mLfdNrNe] + 1", true);

			return HostObject.VariablesPop();
		}

		bool SUB_OutV()
		{
			HostObject.VariablesPush();

			//  **** Datum ermitteln und Monat extrahieren
			HostObject.DefineVariable2("Heute", "D,10,0");
			HostObject.DefineVariable2("Monat", "C,5,0");
			HostObject.Set("Heute", @"H", true);
			HostObject.Set("Monat", @"$[Heute]", true);
			HostObject.Set("Monat", @"$[Monat>2]", true);

			//  **** Waehrung ermitteln
			HostObject.DefineVariable2("Waehrung", "u,3,0");
			HostObject.DefineRecord("Opts", "OPTIONEN", 0, 0, HostObject.EvalString(@""));
			HostObject.FindRecord("Opts", HostObject.EvalString(" 7008"));
			HostObject.Set("Waehrung", @"DEM", true);
			if (HostObject.TestEof("Opts"))
				goto Xwaehr;
			if (HostObject.IsEmpty("Opts.OPTDATAC"))
				goto Xwaehr;
			if (HostObject.CompareString("Opts.OPTDATAC", "=", HostObject.EvalString(@"DM")))
				goto Xwaehr;
			HostObject.Set("Waehrung", @"$[Opts.OPTDATAC]", true);
			Xwaehr:

			//  *** eigene Anschrift
			HostObject.DefineVariable2("myName", "C,30,0");
			HostObject.DefineVariable2("myKurz", "u,13,0");
			HostObject.DefineRecord("Anschr", "EIGENE_ANSCHRIFTEN", 0, 0, HostObject.EvalString(@""));
			if (HostObject.TestEof("Anschr"))
				goto XAdr;
			HostObject.Set("myName", @"$[Anschr.NAME1]", true);
			HostObject.Set("myKurz", @"$[Anschr.KURZNAME]", true);
			XAdr:

			HostObject.DefineVariable2("Info2", "C,40,0");
			HostObject.Set("Info2", @"Stand $[Heute], War.Grp.: $[KeyVonWrg]..$[KeyBisWrg]", true);

			//  **** Ausgabe Vorlaufsatz
			HostObject.Set("Zeile", @"$[Zeile]+1", true);
			HostObject.WriteLine(HostObject.EvalString(@"V $[Heute>2]$[Monat]$[Heute<2]$[ReportTitel<40]$[Info2<40](C) $[myName<31]04$[Waehrung<3]"));
			//  *V50 OUT V;050;A;$[Heute>4]$[Monat]$[Heute<2];$[Waehrung];$[ReportTitel] $[KeyVonWrg]..$[KeyBisWrg];(C) $[myName];$[myKurz];;;;;;;;;

			return HostObject.VariablesPop();
		}

		bool SUB_OutE()
		{
			HostObject.VariablesPush();

			HostObject.Set("Zeile", @"$[Zeile]+1", true);
			//  *V50 OUT E;$[Zeile];;

			return HostObject.VariablesPop();
		}
	}
}
