using System;
using System.Linq;
using System.Windows.Forms;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Report;
using BeWo.Report.ReportObjects;

using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.Extensions;

namespace BeWo.GenderBeWoReports
{
    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);

            foreach (var faufau in c.VarFieldValueList)
            {
                var varFieldValue = Utils.XMLDeserializeFromString(faufau.SerializedValue, Type.GetType(faufau.TypeName));
                if (varFieldValue != null)
                {
                    var vValue = varFieldValue.ToString();

                    switch (faufau.VarFieldDefOid)
                    {
                        case 97: // Versicherungsnummer
                            versicherungsNummernLabel.Text = vValue;
                            break;
                        case 98: // Krankenkassenbefreiung
                            krankenkassenbefreiungsLabel.Text = "ja";
                            break;
                        case 99: // Schwebi
                            schwebiLabel.Text = string.Format("{0}", (Convert.ToDecimal(varFieldValue) > 0
                                ? string.Format("ja {0} %", vValue) 
                                : "nein"));
                            break;
                        case 100: // WBS
                            wbsLabel.Text = ((DateTime) varFieldValue).ToShortDateString();
                            break;
                        case 101: // Aufenthaltsstatus
                            aufenthaltsstatusLabel.Text = vValue;
                            break;
                        case 102: // Köln-Pass
                            koelnPassLabel.Text = ((DateTime) varFieldValue).ToShortDateString();
                            break;
                        case 103: // Schwerbehindertenmerkmale
                            schwebiLabel.Text += string.Format(", {0}", vValue);
                            break;
                        case 104: // Kundennummer Jobcenter
                            jobcenterKundennummerLabel.Text = vValue;
                            break;
                        case 105: // Kundennummer Arbeitsamt
                            arbeitsamtKundennummerLabel.Text = vValue;
                            break;
                        case 106: // Kundennummer Sozialamt
                            sozialamtKundennummerLabel.Text = vValue;
                            break;
                    }
                }
            }

            diagnoseLabel.Text = c.Diagnosis2CustomerList.Select(s => s.ICD10DiagnosisCode).ToSeparatedString(", ");

            // Psychiater/in
            foreach (var psych in pRO.EnvironmentPersons.Where(w => w.RelationRole.TypeDescription.Equals("Psychiater")))
            {
                psychiaterLabel.Text += string.Format("{0}{1}", psych.Person.TitleFirstNameLastNameToString(), Environment.NewLine);
            }

            // Hausärztliche Versorgung
            foreach (var psych in pRO.EnvironmentPersons.Where(w => w.RelationRole.TypeDescription.Equals("Hausarzt")))
            {
                hausarztLabel.Text += string.Format("{0}{1}", psych.Person.TitleFirstNameLastNameToString(), Environment.NewLine);
            }

            // Weitere Ärzte
            foreach (var psych in pRO.EnvironmentPersons.Where(w => w.RelationRole.TypeDescription.Equals("Arzt")))
            {
                weitereAerzteLabel.Text += string.Format("{0}, {1}{2}", psych.Person.TitleFirstNameLastNameToString(), psych.Person.Function, Environment.NewLine);
            }

            var rechtlicherBetreuuer = pRO.EnvironmentPersons.FirstOrDefault(f => f.RelationRole.TypeDescription.Equals("Rechtliche Betreuung"));
            if (rechtlicherBetreuuer != null)
            {
                rechtlicheBetreuungNamensLabel.Text = rechtlicherBetreuuer.Person.TitleFirstNameLastNameToString();
                rechtlicheBetreuungAnschriftsLabel.Text = rechtlicherBetreuuer.Person.AddressString;
                rechtlicheBetreuungTelefonLabel.Text = rechtlicherBetreuuer.Person.Communication1;
                rechtlicheBetreuungFaxLabel.Text = rechtlicherBetreuuer.Person.Communication4;
                rechtlicheBetreuungMailLabel.Text = rechtlicherBetreuuer.Person.Communication3;
            }

            var weitereAnsprechpartner = pRO.EnvironmentPersons.Where(w => w.RelationRole.TypeDescription != "Psychiater" && w.RelationRole.TypeDescription != "Hausarzt" && w.RelationRole.TypeDescription != "Arzt" && w.RelationRole.TypeDescription != "Rechtliche Betreuung");
            if (weitereAnsprechpartner != null)
            {
                foreach (var ansprechpartner in weitereAnsprechpartner)
                {
                    weitereAnsprechpartnerLabel.Text += string.Format("{0}{1}", ansprechpartner.Person.TitleFirstNameLastNameToString(), Environment.NewLine);
                }
            }

            var krankenkasse = pRO.EnvironmentOrganisations.FirstOrDefault(f => f.RelationRole.TypeDescription.Equals("Krankenkasse"));
            if (krankenkasse != null)
            {
                krankenkassenLabel.Text = krankenkasse.Organisation.Name;
            }

            var jobcenter = pRO.EnvironmentOrganisations.FirstOrDefault(f => f.RelationRole.TypeDescription.Equals("Jobcenter"));
            if (jobcenter != null)
            {
                var jobconterRel = c.Customer2OrganisationList.FirstOrDefault(f => f.Organisation.Oid.HasValue && f.Organisation.Oid.Equals(jobcenter.Organisation.OrganisationOid));
                if (jobconterRel != null)
                {
                    var jobcenterAnsprechpartner = jobconterRel.Organisation.Organisation2PersonList.FirstOrDefault();
                    if (jobcenterAnsprechpartner != null)
                        jobcenterLabel.Text = jobcenterAnsprechpartner.Person.FirstNameLastName;
                }
            }

            var arbeitsamt = pRO.EnvironmentOrganisations.FirstOrDefault(f => f.RelationRole.TypeDescription.Equals("Arbeitsamt"));
            if (arbeitsamt != null)
            {
                var arbeitsamtsRel = c.Customer2OrganisationList.FirstOrDefault(f => f.Organisation.Oid.HasValue && f.Organisation.Oid.Equals(arbeitsamt.Organisation.OrganisationOid));
                if (arbeitsamtsRel != null)
                {
                    var arbeitsamtsAnsprechpartner = arbeitsamtsRel.Organisation.Organisation2PersonList.FirstOrDefault();
                    if (arbeitsamtsAnsprechpartner != null)
                        arbeitsamtsLabel.Text = arbeitsamtsAnsprechpartner.Person.FirstNameLastName;
                }
            }

            var sozialamt = pRO.EnvironmentOrganisations.FirstOrDefault(f => f.RelationRole.TypeDescription.Equals("Sozialamt"));
            if (sozialamt != null)
            {
                var sozialamtsRel = c.Customer2OrganisationList.FirstOrDefault(f => f.Organisation.Oid.HasValue && f.Organisation.Oid.Equals(sozialamt.Organisation.OrganisationOid));
                if (sozialamtsRel != null)
                {
                    var sozialamtsAnsprechpartner = sozialamtsRel.Organisation.Organisation2PersonList.FirstOrDefault();
                    if (sozialamtsAnsprechpartner != null)
                        sozialamsLabel.Text = sozialamtsAnsprechpartner.Person.FirstNameLastName;
                }
            }

            if (c.SupportConcepts.Count > 0)
            {
                var zuletztEndender = c.SupportConcepts.First();
                foreach (var hp in c.SupportConcepts.Where(hp => hp.EndDate > zuletztEndender.EndDate))
                {
                    zuletztEndender = hp;
                }

                var zuletztEndenderBlah = zuletztEndender.CostBearer2SupportConceptList.First();
                foreach (var hp in zuletztEndender.CostBearer2SupportConceptList.Where(hp => hp.EndDate > zuletztEndenderBlah.EndDate))
                {
                    zuletztEndenderBlah = hp;
                }

                xrLabel2.Text = zuletztEndenderBlah.CustomerReferenceNumber;
            }
            
            

            bindingSource1.DataSource = pRO;
        }
    }
}
