using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using BeWo.Data.Access;
using BeWo.Data.Entities;

using BS.Shared.Core;

using BeWo.Report.ReportObjects;
using BS.Shared.Extensions;
using DevExpress.XtraReports.UI;

namespace BeWo.Report.VereinLebensgestaltung
{
    public partial class Klientenstammblatt : DevExpress.XtraReports.UI.XtraReport, IBeWoReport<CustomerDataRO>
    {
        public Klientenstammblatt()
        {
            InitializeComponent();
        }

        public void SetReportDataSource(CustomerDataRO pRO)
        {
            var c = DAOFactory.GenericDAO.LoadByID<Customer>(pRO.CustomerOid);

	        String aufgabenKreis = null;
			String aufgabenKreisCheck = "";
            foreach (var vv in c.VarFieldValueList)
            {
                var varFieldValue = Utils.XMLDeserializeFromString(vv.SerializedValue, Type.GetType(vv.TypeName));
                if (varFieldValue != null)
                {
                    switch (vv.VarFieldDefOid)
                    {
                        case 63:
                            geburtsnamensLabel.Text = varFieldValue.ToString();
                            break;
                        case 64:
                            konfessionsLabel.Text = varFieldValue.ToString();
                            break;
                        case 65:
                            staatsangehoerigkeitsLabel.Text = varFieldValue.ToString();
                            break;
                        case 66:
                            //bisherige anschrift
                            //anschriftsLabel.Text = varFieldValue.ToString();
                            break;
                        case 67:
                            //if (((decimal) varFieldValue) > 0)
                            //{
                            //    behindertJaCB.Text = string.Format("ja {0} %", varFieldValue);
                            //}
                            break;
                        case 68:
                            //var gr = Graphics.FromHwnd(IntPtr.Zero);
                            //var a = gr.MeasureString(varFieldValue.ToString(), merkmale1Label.Font);

                            //if (a.Width > merkmale1Label.Width)
                            //{
                            //    WrapText(varFieldValue.ToString(), new List<XRLabel> { merkmale1Label, merkmale2Label });
                            //}

                            break;
                        case 69:
							impfausweisJaCB.Checked = (bool)varFieldValue;
							impfausweisNeinCB.Checked = !(bool)varFieldValue;
                            break;
                        case 70:
							rezeptgebbefreitJaCB.Checked = (bool)varFieldValue;
							rezeptgebbefreitNeinCB.Checked = !(bool)varFieldValue;
                            break;
                        case 71:
                            rezeptgebbefreitLabel.Text = ((DateTime) varFieldValue).ToShortDateString();
                            break;
                        case 72:
							fahrtkostenbefreitJaCB.Checked = (bool)varFieldValue;
							fahrtkostenbefreitNeinCB.Checked = !(bool)varFieldValue;
                            break;
                        case 73:
							gezBefreitJaCB.Checked = (bool)varFieldValue;
							gezBefreitNeinCB.Checked = !(bool)varFieldValue;
                            break;
                        case 74:
		                    break;
                        case 75:
		                    aufgabenKreis = varFieldValue.ToString();
                            //WrapText(varFieldValue.ToString(), new[] {aufgabenKreis1Labelx, aufgabenKreis2Labelx});
                            break;
                        case 76:
                            gdtLabel.Text = varFieldValue.ToString();
                            break;
                        case 77:
                            gdtWohnenLabel.Text = varFieldValue.ToString();
                            break;
                        case 78:
                            WrapText(varFieldValue.ToString(), new List<XRLabel> { gesundRisiko1Label, gesundRisiko2Label });
                            break;
                        case 79: // Allergien/Unverträglichekiten
                            switch (varFieldValue.ToString())
                            {
                                case "ja, welche?":
                                    allergienNeinCB.Checked = false;
                                    allergienJaCB.Checked = true;
                                    allergienNichtBekanntCB.Checked = false;
                                    break;
                                case "nicht bekannt":
                                    allergienNeinCB.Checked = false;
                                    allergienJaCB.Checked = false;
                                    allergienNichtBekanntCB.Checked = true;
                                    break;
                                default:
                                    allergienNeinCB.Checked = true;
                                    allergienJaCB.Checked = false;
                                    allergienNichtBekanntCB.Checked = false;
                                    break;
                            }
                            break;
                        case 80: // Besonderheiten bei der Ernährung
                            besonderheitenErnaehrungLabel.Text = varFieldValue.ToString();
                            break;
                        case 81: // Montag Uhrzeit
                            //strukturMontagLabelx.Text = varFieldValue.ToString();
		                    if (!String.IsNullOrEmpty(varFieldValue.ToString()))
		                    {
			                    cellUhrzeitMontag.Text = varFieldValue.ToString();
			                    //xrCheckBox3.Checked = true;
			                    chkMontag.Checked = true;
		                    }
		                    break;
                        case 82: // Dienstag Uhrzeit
                            //strukturDienstagLabel.Text = varFieldValue.ToString();
		                    if (!String.IsNullOrEmpty(varFieldValue.ToString()))
		                    {
			                    cellUhrzeitDi.Text = varFieldValue.ToString();
			                    //xrCheckBox4.Checked = true;
			                    chkDienstag.Checked = true;
		                    }
		                    break;
                        case 83: // Mittwoch Uhrzeit
                            //strukturMittwochLabel.Text = varFieldValue.ToString();
		                    if (!String.IsNullOrEmpty(varFieldValue.ToString()))
		                    {
			                    cellUhrzeitMi.Text = varFieldValue.ToString();
			                    //xrCheckBox5.Checked = true;
			                    chkMittwoch.Checked = true;
		                    }
		                    break;
                        case 84: // Donnerstag Uhrzeit
                            //strukturDonnerstagLabel.Text = varFieldValue.ToString();
		                    if (!String.IsNullOrEmpty(varFieldValue.ToString()))
		                    {
			                    cellUhrzeitDo.Text = varFieldValue.ToString();
			                    //xrCheckBox6.Checked = true;
			                    chkDonnerstag.Checked = true;
		                    }
		                    break;
                        case 85: // Freitag Uhrzeit
                            //strukturFreitagLabel.Text = varFieldValue.ToString();
		                    if (!String.IsNullOrEmpty(varFieldValue.ToString()))
		                    {
			                    cellUhrzeitFr.Text = varFieldValue.ToString();
			                    //xrCheckBox7.Checked = true;
			                    chkFreitag.Checked = true;
		                    }
		                    break;
                        case 86: // Brille/Kontaktlinsen bool
							brilleCB.Checked = (bool)varFieldValue;
                            break;
                        case 87: // Hörapparat bool
							hoerapparatCB.Checked = (bool)varFieldValue;
                            break;
                        case 88: // Arm-/Beinprothesen bool
							armBeinCB.Checked = (bool)varFieldValue;
                            break;
                        case 89: // orthop. Schuhe
							orthopSchuheCB.Checked = (bool)varFieldValue;
                            break;
                        case 90: // Zahnproth.: oben/unten
							zahnprothCB.Checked = (bool)varFieldValue;
                            break;
                        case 91: // Rollstuhl bool
							rollstuhlCB.Checked = (bool)varFieldValue;
                            break;
                        case 92: // Protektoren (z.B. Helm)
							protektorenCB.Checked = (bool)varFieldValue;
                            break;
                        case 93: // Gehhilfen
							gehhilfenCB.Checked = (bool)varFieldValue;
                            break;
                        case 94: // Bestattungswünsche
                            bestattungswuenscheLabel.Text = varFieldValue.ToString();
                            break;
                        case 95: // Besonderheiten Bewohner
                            besonderheitenLabel.Text = varFieldValue.ToString();
                            break;
                        case 96: // Einzug
                            //einzugsLabel.Text = ((DateTime) varFieldValue).ToShortDateString();
                            break;
						case 97:
							//behindertJaCB.Checked = (bool)varFieldValue;
							//behindertNeinCB.Checked = !(bool)varFieldValue;
		                    break;
						case 98:
							if ((bool) varFieldValue)
		                    {
			                    if (aufgabenKreisCheck.Length > 0)
				                    aufgabenKreisCheck += ", ";
								aufgabenKreisCheck += "Sorge für die Gesundheit";
		                    }
							break;
						case 99:
							if ((bool) varFieldValue)
		                    {
			                    if (aufgabenKreisCheck.Length > 0)
				                    aufgabenKreisCheck += ", ";
								aufgabenKreisCheck += "Vermögenssorge";
		                    }
							break;
						case 100:
							if ((bool) varFieldValue)
		                    {
			                    if (aufgabenKreisCheck.Length > 0)
				                    aufgabenKreisCheck += ", ";
								aufgabenKreisCheck += "Vertretung gegenüber Behörden, Versicherungen und sonstigen Institutionen";
		                    }
							break;
						case 101:
							if ((bool) varFieldValue)
		                    {
			                    if (aufgabenKreisCheck.Length > 0)
				                    aufgabenKreisCheck += ", ";
								aufgabenKreisCheck += "Vertretung in postalischen Angelegenheiten";
		                    }
							break;
						case 102:
							if ((bool) varFieldValue)
		                    {
			                    if (aufgabenKreisCheck.Length > 0)
				                    aufgabenKreisCheck += ", ";
								aufgabenKreisCheck += "Aufenthaltsbestimmung";
		                    }
							break;
						case 103:
							if ((bool) varFieldValue)
		                    {
			                    if (aufgabenKreisCheck.Length > 0)
				                    aufgabenKreisCheck += ", ";
								aufgabenKreisCheck += "Einwilligungsvorbehalt";
		                    }
							break;
						case 104:
		                    if ((bool) varFieldValue)
		                    {
			                    if (aufgabenKreisCheck.Length > 0)
				                    aufgabenKreisCheck += ", ";
								aufgabenKreisCheck += "Vertretung in Wohnungsangelegenheiten";
		                    }
							break;

                    }
                }
            }

            StringBuilder phoneSb = new StringBuilder();
            phoneSb.Append(pRO.Phone);
            if (phoneSb.Length > 0)
                phoneSb.Append(", ");
            phoneSb.Append(pRO.Mobile);
            lblTelefonKlient.Text = phoneSb.ToString();

            if (c.AssistanceBegin.HasValue)
            {
                einzugsLabel.Text = c.AssistanceBegin.Value.ToShortDateString();
            }


            if (!String.IsNullOrWhiteSpace(c.GradDerBehinderung))
            {
                
                behindertJaCB.Text = string.Format("ja {0} %", c.GradDerBehinderung);
                behindertJaCB.Checked = true;
                behindertNeinCB.Checked = false;
            }
            else
            {
                behindertJaCB.Checked = false;
                behindertNeinCB.Checked = true;
            }

            if (c.MerkzeichenListe != null)
            {
                String merkzeichen = "";
                foreach (var mz in c.MerkzeichenListe)
                {
                    if (merkzeichen.Length > 0)
                        merkzeichen += ", ";
                    merkzeichen += mz.ToString();
                }
                //var graph = Graphics.FromHwnd(IntPtr.Zero);
                //var size = graph.MeasureString(merkzeichen, merkmale1Label.Font);

                //if (size.Width > merkmale1Label.Width)
                //{
                WrapText(merkzeichen, new List<XRLabel> { merkmale1Label, merkmale2Label });
                //}
            }

            if (String.IsNullOrEmpty(aufgabenKreisCheck))
	        {
		        cellAufgabenkreis2.Text = aufgabenKreis;
	        }
	        else
	        {
				cellAufgabenkreis2.Text = aufgabenKreisCheck;
	        }
            WrapText(c.Diagnosis2CustomerList.Select(s => s.ICD10DiagnosisCode).ToSeparatedString(", "), new[] { diagnosen1Label, diagnosen2Label });

			var ang = pRO.EnvironmentPersons.Where(w => (
				w.RelationRole.TypeDescription.Equals("Familie") ||
				w.RelationRole.TypeDescription.Equals("Ehepartner") ||
				w.RelationRole.TypeDescription.Equals("Eltern") ||
				w.RelationRole.TypeDescription.Equals("Geschwister") ||
				w.RelationRole.TypeDescription.Equals("Tochter / Sohn") ||
				w.RelationRole.TypeDescription.Equals("sonstige Angehörige") ||
				w.RelationRole.TypeDescription.Equals("Lebensgefährte/in")) && !String.IsNullOrEmpty(w.Customer2PersonNotice) && w.Customer2PersonNotice.ToLower().StartsWith("x")
			).OrderBy(a => a.Person.LastName).ToList();

            if (ang.Count > 0)
            {
                relPers1NameLabel.Text = ang[0].Person.FullName;
                relPers1Anschrift1Label.Text = ang[0].Person.Street;
                relPers1Anschrift2Label.Text = string.Format("{0} {1}", ang[0].Person.PostalCode, ang[0].Person.Town);
                relPers1TelnrLabel.Text = ang[0].Person.Communication1;
                
                if(ang.Count > 1)
                {
                    relPers2NameLabel.Text = ang[1].Person.FullName;
                    relPers2Anschrift1Label.Text = ang[1].Person.Street;
                    relPers2Anschrift2Label.Text = string.Format("{0} {1}", ang[1].Person.PostalCode, ang[1].Person.Town);
                    relPers2TelnrLabel.Text = ang[1].Person.Communication1;
                }
            }

            var kk = pRO.EnvironmentOrganisations.FirstOrDefault(f => f.RelationRole.TypeDescription.Equals("Krankenkasse"));

            if (kk != null && kk.Customer2OrganisationOid != null)
            {
                krankenkassenLabel.Text = kk.Organisation.Name;
                
                //var vnr = pRO.CostBearers.FirstOrDefault(f => f.CostBearer.OrganisationOid.Equals(kk.Organisation.OrganisationOid));

                //if(vnr != null)
                    versichertennrlabel.Text = kk.Info1;
            }

            // Psychiater
            var psychoDoc = pRO.EnvironmentPersons.FirstOrDefault(f => f.RelationRole.TypeDescription.Equals("Psychiater") 
				&& !String.IsNullOrEmpty(f.Customer2PersonNotice) && f.Customer2PersonNotice.ToLower().StartsWith("x"));
            if (psychoDoc != null)
            {
                var tn = string.Format("{0}{1}{2}", psychoDoc.Person.Title, string.IsNullOrEmpty(psychoDoc.Person.Title) ? "" : " ", psychoDoc.Person.FullName);
                psychiaterNameLabel.Text = tn;
                psychiaterAdr1Label.Text = psychoDoc.Person.Street;
                psychiaterAdr2Label.Text = string.Format("{0} {1}", psychoDoc.Person.PostalCode, psychoDoc.Person.Town);
                psychiaterTelLabel.Text = psychoDoc.Person.Communication1;
                psychiaterFaxLabel.Text = psychoDoc.Person.Communication4;
            }
            
            // Hausarzt
            var hausarzt = pRO.EnvironmentPersons.FirstOrDefault(f => f.RelationRole.TypeDescription.Equals("Hausarzt")
				&& !String.IsNullOrEmpty(f.Customer2PersonNotice) && f.Customer2PersonNotice.ToLower().StartsWith("x"));
            if (hausarzt != null)
            {
                var tn = string.Format("{0}{1}{2}", hausarzt.Person.Title, string.IsNullOrEmpty(hausarzt.Person.Title) ? "" : " ", hausarzt.Person.FullName);
                hausarztNameLabel.Text = tn;
                hausarztAdresse1Label.Text = hausarzt.Person.Street; 
                hausarztAdresse2Label.Text = string.Format("{0} {1}", hausarzt.Person.PostalCode, hausarzt.Person.Town);
                hausarztTelLabel.Text = hausarzt.Person.Communication1;
                hausarztFaxLabel.Text = hausarzt.Person.Communication4;
            }

            var fachaerzte = pRO.EnvironmentPersons.Where(w => 
				(w.RelationRole.TypeDescription.Equals("Augenarzt") ||
				 w.RelationRole.TypeDescription.Equals("Gynäkologe") ||
				 w.RelationRole.TypeDescription.Equals("Hautarzt") ||
				 w.RelationRole.TypeDescription.Equals("Hepatologe") ||
				 w.RelationRole.TypeDescription.Equals("HNO-Arzt") ||
				 w.RelationRole.TypeDescription.Equals("Internist") ||
				 w.RelationRole.TypeDescription.Equals("Kardiologe") ||
				 w.RelationRole.TypeDescription.Equals("Orthopäde") ||
				 w.RelationRole.TypeDescription.Equals("Podologe") ||
				 w.RelationRole.TypeDescription.Equals("Psychotherapeut") ||
				 w.RelationRole.TypeDescription.Equals("Sonstige Fachärzte") ||
				 w.RelationRole.TypeDescription.Equals("Zahnarzt"))
				&& !String.IsNullOrEmpty(w.Customer2PersonNotice) && w.Customer2PersonNotice.ToLower().StartsWith("x")).Take(2).ToList();

            if (fachaerzte.Count > 0)
            {
                var t = fachaerzte[0].Person.Title;
                facharzt1NameLabel.Text = t + (string.IsNullOrEmpty(t) ? "" : " ") + fachaerzte[0].Person.FullName;
                facharzt1Adress1Label.Text = fachaerzte[0].Person.Street;
                facharzt1Adress2Label.Text = string.Format("{0} {1}", fachaerzte[0].Person.PostalCode, fachaerzte[0].Person.Town);
                facharzt1TelLabel.Text = fachaerzte[0].Person.Communication1;
                facharzt1FaxLabel.Text = fachaerzte[0].Person.Communication1;

                if (fachaerzte.Count >= 2)
                {
                    t = fachaerzte[1].Person.Title;
                    facharzt2NameLabel.Text = t + (string.IsNullOrEmpty(t) ? "" : " ") + fachaerzte[1].Person.FullName;
                    facharzt2Adress1Label.Text = fachaerzte[1].Person.Street;
                    facharzt2Adress2Label.Text = string.Format("{0} {1}", fachaerzte[1].Person.PostalCode, fachaerzte[1].Person.Town);
                    facharzt2TelLabel.Text = fachaerzte[1].Person.Communication1;
                    facharzt2FaxLabel.Text = fachaerzte[1].Person.Communication1;
                }
            }

            var endeBewilligung = new DateTime(1900, 1, 1);
            foreach (var hp in c.SupportConcepts)
            {
	            if (hp.EndDate.HasValue && hp.EndDate.Value > endeBewilligung)
	            {
		            endeBewilligung = hp.EndDate.Value;
	            }
            }

            kostenzusageBisLabel.Text = endeBewilligung.Equals(new DateTime(1900, 1, 1)) ? "" : endeBewilligung.ToShortDateString();

			var gesetzlicherBetreuer = pRO.EnvironmentPersons.FirstOrDefault(f =>
				(f.RelationRole.TypeDescription.Equals("Gesetzliche Betreuung") ||
				f.RelationRole.TypeDescription.Equals("Gesetzliche Betreuung/Angehörige/r"))
				&& !String.IsNullOrEmpty(f.Customer2PersonNotice) && f.Customer2PersonNotice.ToLower().StartsWith("x"));

			
	        if (gesetzlicherBetreuer != null)
	        {
		        gesetzlicheBetreuungJaCB.Checked = true;
		        gesetzlicheBetreuungNeinCB.Checked = false;
		        
		        cellGestzBetreuer.Text = gesetzlicherBetreuer.Person.FullName;
		        cellAnschrift1.Text = gesetzlicherBetreuer.Person.Street;
		        cellAnschrift2.Text = string.Format("{0} {1}", gesetzlicherBetreuer.Person.PostalCode,
			        gesetzlicherBetreuer.Person.Town);
		        cellTel.Text = gesetzlicherBetreuer.Person.Communication1;
		        cellFax.Text = gesetzlicherBetreuer.Person.Communication4;
	        }
	        else
	        {
				gesetzlicheBetreuungJaCB.Checked = false;
				gesetzlicheBetreuungNeinCB.Checked = true;
	        }

			
	        var betreuer =
				pRO.RelatedEmployees.FirstOrDefault(e2c => e2c.RelationRole != null && e2c.RelationRole.TypeDescription.ToLower().Contains("koordinierende bezugsbetreuung"));

	        if (betreuer == null)
	        {
				betreuer =
					pRO.RelatedEmployees.FirstOrDefault(e2c => e2c.RelationRole != null && e2c.RelationRole.TypeDescription.ToLower().Contains("bezugsbetreuung"));
	        }

	        if (betreuer != null)
	        {
				lblBetreuuer.Text = String.Format("Koordinierende Bezugsbetreuung: {0} {1}", betreuer.Employee.FirstName, betreuer.Employee.LastName);
	        }

	        String betreuungsart = "";
			String kostentraeger = "";
			String aktenzeichen = "";

	        decimal? fls = null;
	        
			foreach (var hp in c.SupportConcepts)
            {
	            if (String.IsNullOrEmpty(betreuungsart) && (c.SupportConcepts.Count == 1 || 
					(hp.StartDate.HasValue && hp.StartDate <= DateTime.Now && hp.EndDate.HasValue &&
	                hp.EndDate.Value >= DateTime.Now)))
	            {
		            foreach (var c2s in hp.CostBearer2SupportConceptList)
		            {
			            foreach (var scap in c2s.ApprovalPeriodList)
			            {
				            if (scap.ServiceCategory != null)
				            {
					            betreuungsart = scap.ServiceCategory.Name;
					            if (betreuungsart.StartsWith("Wohnheim"))
					            {
						            betreuungsart = "Wohnheim";
					            }
				            }

				            fls = scap.ApprovedBEPerInterval;
			            }
			            kostentraeger = c2s.CostBearer.Organisation.Name;
			            aktenzeichen = c2s.CustomerReferenceNumber;
		            }
	            }
            }

	        kostentraegerLabel.Text = kostentraeger;
	        lblAktenzeichen.Text = aktenzeichen;

	        lblBetreuungsart.Text = betreuungsart;
	        lblFLS.Text = String.Format("{0:0.##}", fls);
            bindingSource1.DataSource = pRO;
        }

        private void WrapText(string varFieldValue, IList<XRLabel> labels)
        {
            var gr = Graphics.FromHwnd(IntPtr.Zero);
            var a = gr.MeasureString(varFieldValue, labels[0].Font);

            if (a.Width > labels[0].Width)
            {
                var x = varFieldValue;
                var zwoteZeile = string.Empty;

                var cutString = x;
                while (gr.MeasureString(cutString, labels[0].Font).Width > labels[0].Width)
                {
                    var li = cutString.LastIndexOf(' ');

                    cutString = cutString.Substring(0, li);
                    zwoteZeile = x.Substring(li, x.Length - li);
                }

                labels[0].Text = cutString;
                labels[1].Text = zwoteZeile.TrimStart(new[] {' '});
            }
            else
            {
                labels[0].Text = varFieldValue;
            }
        }
    }
}
