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

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

		private bool m_IsLastPage = false;
		private bool m_RegisterOutput = false;
		IReportRecord m_recAuftrag;

		public rp2751_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]");

			// Ü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", "Serviceprotokoll", true);

			m_recAuftrag = HostObject.DefineRecord("recAuftrag", "WARTUNGSAUFTRAEGE", 11, 20, HostObject.EvalString(@"$[mBelegNr<20]"));
			HostObject.DefineRecord("recObject", "WARTUNGSOBJEKTE", 0, 8, HostObject.EvalString(@"$[recAuftrag.ObjektId>8]"));
			HostObject.DefineRecord("recKunde", "ADRESSSTAMM", 0, 15, HostObject.EvalString(@"$[recAuftrag.KdNr<15]"));
			HostObject.DefineRecord("recEinheit", "Mengeneinheiten", 0, 0, "");

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

			Posten();
			Unterschriften();
			//HostObject.FormFeed();

			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", "$[recAuftrag.Termin]", true);
				HostObject.Set("VorlaufLabel5", "Monteur", true);
				HostObject.Set("VorlaufValue5", "$[recAuftrag.Monteur]", true);
				HostObject.ProcessDestAddress("recKunde");
				HostObject.ProcessResource("Adresse");
				HostObject.ProcessResource("Vorlauf");
				HostObject.ProcessResource("Betreff");

				AuftragsText();
				// Kopf nur Drucken, wenn sich der Text nicht auf der Folgeseite fortgesetzt wurde.
				if (HostObject.EvalInt("$[Seite]") == 1)
					HostObject.ProcessResource("PostenKopf");
			}
			else
			{
				HostObject.ProcessResource("PostenKopf");
			}
		}

		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 bsPdfFileName = szOutFileName.Substring(0, szOutFileName.LastIndexOf('.')) + ".pdf";
                try
                {
					HostObject.ConvertToPdf(szOutFileName, bsPdfFileName);
				}
				catch(Exception e)
				{
                    HostObject.Confirm(e.Message);
					return;
                }

				string bsStamp = HostObject.RegisterFileReference(bsPdfFileName);
				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(bsPdfFileName);
				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 AuftragsText()
		{
			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))
			{
				HostObject.LineFeed(1);

				string[] textLines = bsText.Split('\n');
				foreach (string textLine in textLines)
				{
					HostObject.CheckPageSpace(2);
					HostObject.ProcessLTextLine(textLine, false);
				}
			}
		}

		void Posten()
		{
			IReportRecord recPosten = HostObject.DefineRecord("recPosten", "WartungsPosten", 0, 8, HostObject.EvalString(@"$[recAuftrag.Ident>8]"));
			while (!recPosten.Eof)
			{
				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 Unterschriften()
		{
			// ermitteln der Dateinamen und Export der Dateien
			HostObject.VariablesPush();

			string bsUnterschriftMonteur = null;
			string bsUnterschriftKunde = null;

			string bsFilter = ((int)(m_recAuftrag.Get("Ident"))).ToString().PadLeft(8);
			IReportRecord recAnhang = HostObject.DefineRecord("recAnhang9998", "WartungsAnhang", 0, 8, bsFilter);
			while ((!recAnhang.Eof) && (String.IsNullOrEmpty(bsUnterschriftMonteur) || String.IsNullOrEmpty(bsUnterschriftKunde)))
			{
				string bsOrgName = System.IO.Path.GetFileName((string)(recAnhang.Get("OrgName"))).ToLowerInvariant();
				string bsStamp = (string)(recAnhang.Get("Stamp"));
				if (!String.IsNullOrEmpty(bsStamp))
				{
					switch (bsOrgName)
					{
						case "unterschrift-monteur.jpg":
							bsUnterschriftMonteur = HostObject.ExportFileReference(bsStamp);
							break;

						case "unterschrift-kunde.jpg":
							bsUnterschriftKunde = HostObject.ExportFileReference(bsStamp);
							break;
					}
				}
				recAnhang.GoNext();
			}

			HostObject.VariablesPop();

			// Ausgabe
			if (!(String.IsNullOrEmpty(bsUnterschriftMonteur) && String.IsNullOrEmpty(bsUnterschriftKunde)))
			{
				HostObject.CheckPageSpace(8);
				HostObject.ProcessResource("Line");
				if (!String.IsNullOrEmpty(bsUnterschriftMonteur))
					HostObject.ProzessImage(0, 50, 5, false, bsUnterschriftMonteur);
				if (!String.IsNullOrEmpty(bsUnterschriftKunde))
					HostObject.ProzessImage(50, 50, 5, true, bsUnterschriftKunde);
				HostObject.ProcessResource("Line");
			}
		}

		#endregion
	}
}
