// Serviceprotokoll
// Parameter mBelegNr u,20,0
// Parameter RegisterIt L,1,0
using craftsReport.Interfaces;
using System;

namespace craftsReport.modules
{
	public class rp2750_xbs : IReportModule, IReportModuleEvents
	{
		#region Members and Contructor

		private bool m_IsLastPage = false;
		private bool m_RegisterOutput = false;
		private bool m_IsWartung = false;
		IReportRecord m_recAuftrag;
		IReportRecord m_recObject;
		IReportRecord m_recAnlage;
		IReportRecord m_recKunde;
		IReportRecord m_recStandort;
		IReportRecord m_recMieter;

		public rp2750_xbs()
		{
		}

		#endregion

		#region IReportModule

		public IReportHost HostObject { set; get; }

		public bool Execute()
		{
			// Diesen Bericht im Trigger OnAfterExecute als Auftragsanhang registrieren ?
			if (HostObject.IsVar("RegisterIt"))
				m_RegisterOutput = HostObject.EvalBool("$[RegisterIt]");

			HostObject.DefineVariable2("mKastenSymbol", "c,10,0");
			HostObject.Set("mKastenSymbol", "" + (char)0xA8 , false);

			m_recAuftrag = HostObject.DefineRecord("recAuftrag", "WARTUNGSAUFTRAEGE", 11, 20, HostObject.EvalString(@"$[mBelegNr<20]"));
			m_IsWartung = HostObject.EvalInt("$[recAuftrag.Art]") < 2;

			// Überschrift festlegen, zusammen mit mBelegNr wird daraus der JobName gebildet
			if (!HostObject.IsVar("mRepTitle"))
				HostObject.DefineVariable2("mRepTitle", "c,250,0");
			if (HostObject.IsEmpty("mRepTitle"))
				HostObject.Set("mRepTitle",	m_IsWartung ? "Wartungsauftrag" : "Monteurauftrag", false);

			HostObject.DefineVariable2("mTerminText", "c,30,0");
			HostObject.Set("mTerminText", "$[recAuftrag.Termin]", true);
			if (!HostObject.IsEmpty("recAuftrag.Uhrzeit"))
				HostObject.Set("mTerminText", "$[recAuftrag.Termin] $[recAuftrag.Uhrzeit]", true);


			m_recObject = HostObject.DefineRecord("recObject", "WARTUNGSOBJEKTE", 0, 8, HostObject.EvalString(@"$[recAuftrag.ObjektId>8]"));
			m_recAnlage = HostObject.DefineRecord("recAnlage", "WARTUNGSANLAGEN", 0, 8, HostObject.EvalString(@"$[recAuftrag.AnlagenId>8]"));
			m_recKunde = HostObject.DefineRecord("recKunde", "ADRESSSTAMM", 0, 15, HostObject.EvalString(@"$[recAuftrag.KdNr<15]"));
			HostObject.DefineRecord("recEinheit", "Mengeneinheiten", 0, 0, "");
			
			// Mieteradresse
			if (!HostObject.IsEmpty("recAnlage.Mieter"))
				m_recMieter = HostObject.DefineRecord("recMieter", "ADRESSSTAMM", 0, 15, HostObject.EvalString(@"$[recAnlage.Mieter<15]"));
			else
				m_recMieter = HostObject.DefineRecord("recMieter", "ADRESSSTAMM", 0, 15, HostObject.EvalString(@"$[recObject.Mieter<15]"));

			// Standadresse
			if (!HostObject.IsEmpty("recObject.Standort"))
				m_recStandort = HostObject.DefineRecord("recStandort", "ADRESSSTAMM", 0, 15, HostObject.EvalString(@"$[recObject.Standort<15]"));
			else
				m_recStandort = HostObject.DefineRecord("recStandort", "ADRESSSTAMM", 0, 15, HostObject.EvalString(@"$[recAuftrag.KdNr<15]"));
			
			// Dimensionszuordnung
			HostObject.DefineVariable2("cDimName1", "u,40,0");
			HostObject.DefineVariable2("cDimName2", "u,40,0");
			HostObject.DefineVariable2("cDimName3", "u,40,0");
			HostObject.DefineVariable2("cDimName4", "u,40,0");
			HostObject.DefineVariable2("cDimName5", "u,40,0");
			HostObject.Set("cDimName1", "$[recAnlage.Dimension1]", true);
			HostObject.Set("cDimName2", "$[recAnlage.Dimension2]", true);
			HostObject.Set("cDimName3", "$[recAnlage.Dimension3]", true);
			HostObject.Set("cDimName4", "$[recAnlage.Dimension4]", true);
			HostObject.Set("cDimName5", "$[recAnlage.Dimension5]", true);

			HostObject.LoadAdditionalResources("/d");
			HostObject.PaperDefinition("PaperDefinition");
			HostObject.DokumentStart();
			HostObject.SeitenKopf();

			StandOrt();
			AuftragsText();
			AnlagenDaten();
			CheckList();
			FreeLines();

			m_IsLastPage = true;
			HostObject.SeitenFuss();
			HostObject.DokumentEnde();

			return true;
		}

		#endregion

		#region IReportModuleEvents

		public void OnAfterPageStart()
		{
			if (HostObject.EvalInt("$[Seite]") == 1)
			{
				HostObject.Set("VorlaufLabel1", "Kundennummer", true);
				HostObject.Set("VorlaufValue1", "$[recAuftrag.KdNr]", true);
				HostObject.Set("VorlaufLabel2", "Datum", true);
				HostObject.Set("VorlaufValue2", "$[recAuftrag.Datum]", true);
				HostObject.Set("VorlaufLabel3", "Projekt", true);
				HostObject.Set("VorlaufValue3", "$[recAuftrag.PrjNr]", true);
				HostObject.Set("VorlaufLabel4", "Termin", true);
				HostObject.Set("VorlaufValue4", "$[mTerminText]", true);
				HostObject.Set("VorlaufLabel5", "Monteur", true);
				HostObject.Set("VorlaufValue5", "$[recAuftrag.Monteur]", true);
				HostObject.ProcessDestAddress("recKunde");
				HostObject.ProcessResource("Adresse");
				HostObject.ProcessResource("Vorlauf");
			}
			else
			{
			}
		}

		public void OnBeforePageClose()
		{
			if (m_IsLastPage)
			{
				// HostObject.ProcessResource("Sterne");
			}
			else
			{
				int nextPageNo = HostObject.EvalInt("$[Seite]") + 1;
				string bsText = "Fortsetzung auf Seite " + nextPageNo.ToString();
				HostObject.Set("Zeile", "$[ZlMax] - 1", true);
				HostObject.ProcessRTextLine(bsText, false);
			}
		}

		public void OnAfterExecute(string szOutFileName)
		{
			if (m_RegisterOutput)
			{
				string bsStamp = HostObject.RegisterFileReference(szOutFileName);
				string bsFilter = ((int)(m_recAuftrag.Get("Ident"))).ToString().PadLeft(8);
				IReportRecord recAnhang = HostObject.DefineRecord("recAnhang9999", "WartungsAnhang", 0, 8, bsFilter);

				int nLfdNr = 0;
				while (!recAnhang.Eof)
				{
					string bsStamp2 = (string)(recAnhang.Get("Stamp"));
					if (bsStamp2 == bsStamp)
						return;

					nLfdNr = (int)(recAnhang.Get("LfdNr"));
					recAnhang.GoNext();
				}

				string bsName = System.IO.Path.GetFileName(szOutFileName);
				string bsExt = bsName.Substring(bsName.LastIndexOf('.') + 1);

				nLfdNr++;
				recAnhang.Set("AuftragId", m_recAuftrag.Get("Ident"));
				recAnhang.Set("PosNr", 0);
				recAnhang.Set("LfdNr", nLfdNr);
				recAnhang.Set("ObjektId", m_recAuftrag.Get("ObjektId"));
				recAnhang.Set("AnlagenId", m_recAuftrag.Get("AnlagenId"));
				recAnhang.Set("Stamp", bsStamp);
				recAnhang.Set("OrgName", bsName);
				recAnhang.Set("Extension", bsExt);
				recAnhang.Insert();
				// System.Windows.Forms.MessageBox.Show(szOutFileName + "\r\n" + bsFilter + "/" + nLfdNr.ToString(), bsStamp);
			}
		}

		#endregion

		#region Internals

		void StandOrt()
		{
			HostObject.ProcessResource("Standort");
		}

		void AnlagenDaten()
		{
			if (HostObject.IsEmpty("recAnlage.Nr"))	return;
		
			HostObject.VariablesPush();
			HostObject.ProcessResource("AnlagenKopf");

			// Bestandteile
			int nMaxAnzahl = HostObject.EvalInt("$[recAnlage.AnzBT]");
			int nCount = 0;
			IReportRecord recTeil = HostObject.DefineRecord("recTeil", "WARTUNGSPOSITIONEN", 0, 8, HostObject.EvalString(@"$[recAnlage.Ident>8]"));
			while ((!recTeil.Eof) && ((nMaxAnzahl == 0) || (nCount++ < nMaxAnzahl)))
			{
				HostObject.VariablesPush();
				HostObject.DefineVariable2("cDimWert1", "C,40,0");
				HostObject.DefineVariable2("cDimWert2", "C,40,0");
				HostObject.DefineVariable2("cDimWert3", "C,40,0");
				HostObject.DefineVariable2("cDimWert4", "C,40,0");
				HostObject.DefineVariable2("cDimWert5", "C,40,0");
				HostObject.DefineVariable2("cBez", "u,40,0");

				// Dimensionswerte einsammeln
				IReportRecord recDim = HostObject.DefineRecord("recDim", "WARTUNGSDIMENSIONEN", 0, 12, HostObject.EvalString(@"$[recTeil.AnlagenId>8]$[recTeil.PosNr>4]"));
				while(!recDim.Eof)
				{
					HostObject.Set("cBez", @"$[recDim.Bez]", true);
					if (HostObject.CompareString("cBez", "=", HostObject.EvalString(@"$[cDimName1]")))
						HostObject.Set("cDimWert1", @"$[recDim.Wert]", true);
					if (HostObject.CompareString("cBez", "=", HostObject.EvalString(@"$[cDimName2]")))
						HostObject.Set("cDimWert2", @"$[recDim.Wert]", true);
					if (HostObject.CompareString("cBez", "=", HostObject.EvalString(@"$[cDimName3]")))
						HostObject.Set("cDimWert3", @"$[recDim.Wert]", true);
					if (HostObject.CompareString("cBez", "=", HostObject.EvalString(@"$[cDimName4]")))
						HostObject.Set("cDimWert4", @"$[recDim.Wert]", true);
					if (HostObject.CompareString("cBez", "=", HostObject.EvalString(@"$[cDimName5]")))
						HostObject.Set("cDimWert5", @"$[recDim.Wert]", true);
					recDim.GoNext();
				}
				
				HostObject.ProcessResource("AnlagenDetail");
				HostObject.VariablesPop();
				recTeil.GoNext();
			}
			HostObject.VariablesPop();
		}

		void AuftragsText()
		{
			if (!HostObject.IsEmpty("recAuftrag.Betreff"))
			{
				HostObject.ProcessResource("Betreff");
			}
			
			string bsTextNr = "AUF" + m_recAuftrag.Get("Ident").ToString().PadLeft(15);
			string bsText = HostObject.ReadMasterDataTextBlob(25, "AU", bsTextNr).Replace("\r", "").TrimEnd('\n');
			if (!String.IsNullOrEmpty(bsText))
			{
				string[] textLines = bsText.Split('\n');
				foreach (string textLine in textLines)
				{
					HostObject.CheckPageSpace(2);
					HostObject.ProcessLTextLine(textLine, false);
				}
			}
		}

		void CheckList()
		{
			IReportRecord recPosten = HostObject.DefineRecord("recPosten", "WartungsPosten", 0, 8, HostObject.EvalString(@"$[recAuftrag.Ident>8]"));
			if (!recPosten.Eof)
			{
				HostObject.ProcessResource("PostenKopf");
			}
			while (!recPosten.Eof)
			{
				if (HostObject.EvalBool("$[recPosten.Check]"))
				{
					HostObject.VariablesPush();

					int nZeile2 = HostObject.IsEmpty("recPosten.Bez2") ? 0 : 1;
					int nZeile3 = HostObject.IsEmpty("recPosten.Merkmal") ? 0 : 1;
					int nSpace = 2 + nZeile2 + nZeile3;
					HostObject.CheckPageSpace(nSpace);

					HostObject.FindRecord("recEinheit", HostObject.EvalString("$[recPosten.Einheit>4]"));

					HostObject.DefineVariable2("PostenStatus", "c,10,0");
					if ((bool)(recPosten.Get("MfrDone")))
						HostObject.Set("PostenStatus", "x", false);
					else if ((bool)(recPosten.Get("MfrFail")))
						HostObject.Set("PostenStatus", "-", false);

					HostObject.ProcessResource("PostenZeile");
					if (nZeile2 > 0) HostObject.ProcessResource("PostenZeile2");
					if (nZeile3 > 0) HostObject.ProcessResource("PostenZeile3");

					HostObject.VariablesPop();
				}
				recPosten.GoNext();
			}
		}

		void FreeLines()
		{
			// Leere Zeilen generieren
			//if (HostObject.EvalBool("$[Zeile] < ($[ZlMax] - 6)"))
			//{
				//HostObject.ProcessResource("Line");
				while (HostObject.EvalBool("$[Zeile] < ($[ZlMax] - 6)"))
				{
                    HostObject.ProcessResource("Freizeile");
                }
            //}

            //if (HostObject.EvalBool("$[Zeile] < ($[ZlMax] - 4)"))
            //{
                //HostObject.ProcessResource("Line");
                while (HostObject.EvalBool("$[Zeile] < ($[ZlMax] - 4)"))
                {
					HostObject.ProcessResource("Monteureinsatz");
                }
            //}
            
			HostObject.Set("Zeile", "$[ZlMax] - 3", true);
			HostObject.CheckPageSpace(3);
			HostObject.ProcessResource("Unterschriften");
		}

		#endregion
	}
}
