using System;
using System.Collections.Generic;
using System.Text;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Report.ReportObjects;
using BS.Shared.DataContracts;

namespace BeWo.Report.DefaultReports.Alt
{
    public partial class Spitzabrechnung : DevExpress.XtraReports.UI.XtraReport, IBeWoReport<SettlementRO>
    {
        public Spitzabrechnung()
        {
            InitializeComponent();
        }

        public void SetReportDataSource(SettlementRO pRO)
        {
            if (String.IsNullOrEmpty(pRO.Notice))
            {
                lblNotice.Visible = false;
            }
            if (pRO.ClaimWithEigenbeteiligung < 0)
            {
                pRO.FinalSentence = "Die geleistete Überzahlung wird nach Ihrer Abrechnung Ihrem Konto gutgeschrieben.";
            }

            bool isDefaultSpitzabrechnung = false;

            if (pRO.InvoiceItems != null && pRO.InvoiceItems.Count == 1)
            {
                var ii = pRO.InvoiceItems[0];
                if ((ii.ItemDescription == "Spitzabrechung" || ii.ItemDescription == "Spitzabrechnung") && ii.GrossAmountTotal == null && ii.RateFactor == null)
                {
                    isDefaultSpitzabrechnung = true;
                }
            }
            if (!isDefaultSpitzabrechnung)
            {
                if (pRO.DifferentHourlyRateCount > 0 && pRO.HourlyRateNew.HasValue)
                {
                    isDefaultSpitzabrechnung = true;
                }
            }

            var costBearer = GetCostbearer(pRO);


            if (isDefaultSpitzabrechnung)
            {

                pRO.InvoiceItems = CreateDefaultSpitzabrechnungInvoiceItems(pRO);

                if (pRO.RateFactor != 1 && costBearer != null && costBearer.IsCalculatingWithFactor)
                {
                    pRO.RateFactorText = null;
                    pRO.RateFactorText2 = null;

                    pRO.ApprovedFLS = pRO.ApprovedFLSWithFactor;
                }
            }
            else
            {

                if (costBearer != null && costBearer.ID == "LWLNEU")
                {
                    pRO.RateFactorText = null;
                    pRO.RateFactorText2 = null;

                    if (pRO.InvoiceItems != null)
                    {
                        foreach (var ii in pRO.InvoiceItems)
                        {
                            ii.ItemDescription = String.Format("{0:dd.MM.yyyy} bis {1:dd.MM.yyyy}: {2:0.##} FLS x {3:c}",
                                ii.ItemPeriodStart, ii.ItemPeriodEnd, ii.UnitCount, ii.AmountPerUnit);
                        }
                    }
                }
                else
                {
                    if (pRO.InvoiceItems != null)
                    {
                        foreach (var ii in pRO.InvoiceItems)
                        {
                            ii.ItemDescription = String.Format("{0:dd.MM.yyyy} bis {1:dd.MM.yyyy}: {2:0.##} FLS {3}x {4:c}",
                                ii.ItemPeriodStart, ii.ItemPeriodEnd,
                                ii.UnitCount, ii.RateFactor == 0 ? "" : "x " + pRO.RateFactorText2 + " ",
                                ii.AmountPerUnit);
                        }
                    }
                    if (pRO.RateFactor != 1 && costBearer != null && costBearer.IsCalculatingWithFactor)
                    {
                        pRO.RateFactorText = null;
                        pRO.RateFactorText2 = null;

                        pRO.ApprovedFLS = pRO.ApprovedFLSWithFactor;
                    }
                }
            }

            StringBuilder sb = new StringBuilder();
            if (!String.IsNullOrEmpty(pRO.RecipientOrganisation) && !String.IsNullOrEmpty(pRO.RecipientOrganisation.Trim()))
            {
                sb.AppendLine(pRO.RecipientOrganisation);
            }
            if (!String.IsNullOrEmpty(pRO.RecipientContactPerson) && !String.IsNullOrEmpty(pRO.RecipientContactPerson.Trim()))
            {
                sb.AppendLine(pRO.RecipientContactPerson);
            }
            if (!String.IsNullOrEmpty(pRO.RecipientDivision) && !String.IsNullOrEmpty(pRO.RecipientDivision.Trim()))
            {
                sb.AppendLine(pRO.RecipientDivision);
            }
            if (!String.IsNullOrEmpty(pRO.RecipientStreet) && !String.IsNullOrEmpty(pRO.RecipientStreet.Trim()))
            {
                sb.AppendLine(pRO.RecipientStreet);
            }
            if (!String.IsNullOrEmpty(pRO.RecipientPostCodeAndTown) && !String.IsNullOrEmpty(pRO.RecipientPostCodeAndTown.Trim()))
            {
                sb.AppendLine(pRO.RecipientPostCodeAndTown);
            }

            lblAddress.Text = sb.ToString();

            this.bindingSource1.DataSource = pRO;
        }

        private CostBearer GetCostbearer(SettlementRO pRO)
        {
            var cb2sc = DAOFactory.GenericDAO.LoadByID<CostBearer2SupportConcept>(pRO.CostBearer2SupportConceptOid);
            return cb2sc.CostBearer;
        }

        private IList<InvoiceItemDC> CreateDefaultSpitzabrechnungInvoiceItems(SettlementRO pRO)
        {
            IList<InvoiceItemDC> itemList = new List<InvoiceItemDC>();
            if (pRO.DifferentHourlyRateCount == 3)
            {
                itemList.Add(new InvoiceItemDC
                {
                    ItemDescription = String.Format("{0} bis {1}: {2:0.##} FLS {3}x {4:c}",
                        pRO.AccountingStartDateString, pRO.HourlyRate3EndDateString,
                        pRO.GeleisteteFLSMitStundensatz3, pRO.RateFactor == 1 ? "" : "x " + pRO.RateFactorText2 + " ", pRO.HourlyRate3),

                    GrossAmountTotal = pRO.GeleisteteFLSMitStundensatz3 * pRO.RateFactor * pRO.HourlyRate3
                });

                itemList.Add(new InvoiceItemDC
                {
                    ItemDescription = String.Format("{0} bis {1}: {2:0.##} FLS {3}x {4:c}",
                        pRO.HourlyRateOldStartDateString, pRO.HourlyRateOldEndDateString,
                        pRO.GeleisteteFLSMitStundensatzAlt, pRO.RateFactor == 1 ? "" : "x " + pRO.RateFactorText2 + " ", pRO.HourlyRateOld),

                    GrossAmountTotal = pRO.GeleisteteFLSMitStundensatzAlt * pRO.RateFactor * pRO.HourlyRateOld
                });

                itemList.Add(new InvoiceItemDC
                {
                    ItemDescription = String.Format("{0} bis {1}: {2:0.##} FLS {3}x {4:c}",
                        pRO.HourlyRateNewStartDateString, pRO.AccountingEndDateString,
                        pRO.GeleisteteFLSMitStundensatzAktuell, pRO.RateFactor == 1 ? "" : "x " + pRO.RateFactorText2 + " ", pRO.HourlyRateNew),

                    GrossAmountTotal = pRO.GeleisteteFLSMitStundensatzAktuell * pRO.RateFactor * pRO.HourlyRateNew
                });

            }
            else if (pRO.DifferentHourlyRateCount == 2)
            {
                itemList.Add(new InvoiceItemDC
                {
                    ItemDescription = String.Format("{0} bis {1}: {2:0.##} FLS {3}x {4:c}",
                        pRO.AccountingStartDateString, pRO.HourlyRateOldEndDateString,
                        pRO.GeleisteteFLSMitStundensatzAlt, pRO.RateFactor == 1 ? "" : "x " + pRO.RateFactorText2 + " ", pRO.HourlyRateOld),

                    GrossAmountTotal = pRO.GeleisteteFLSMitStundensatzAlt * (decimal)pRO.RateFactor * pRO.HourlyRateOld
                });

                itemList.Add(new InvoiceItemDC
                {
                    ItemDescription = String.Format("{0} bis {1}: {2:0.##} FLS {3}x {4:c}",
                        pRO.HourlyRateNewStartDateString, pRO.AccountingEndDateString,
                        pRO.GeleisteteFLSMitStundensatzAktuell, pRO.RateFactor == 1 ? "" : "x " + pRO.RateFactorText2 + " ", pRO.HourlyRateNew),

                    GrossAmountTotal = pRO.GeleisteteFLSMitStundensatzAktuell * pRO.RateFactor * pRO.HourlyRateNew
                });

            }
            else
            {
                itemList.Add(new InvoiceItemDC
                {
                    ItemDescription = String.Format("{0} bis {1}: {2:0.##} FLS {3}x {4:c}",
                        pRO.AccountingStartDateString, pRO.AccountingEndDateString,
                        pRO.GeleisteteFLSMitStundensatzAktuell, pRO.RateFactor == 1 ? "" : "x " + pRO.RateFactorText2 + " ", pRO.HourlyRateNew),

                    GrossAmountTotal = pRO.GeleisteteFLSMitStundensatzAktuell * pRO.RateFactor * pRO.HourlyRateNew
                });

            }

            return itemList;
        }

        private void UpdateAbrechnungsFelder(SettlementRO pRO)
        {
            if (pRO.DifferentHourlyRateCount == 3)
            {
                //Erbrachte Leistungen (FLS) - bis [HourlyRateOldEndDateString] à [HourlyRateOldString] €

                pRO.Abrechnungstext1 = String.Format("{0} bis {1}",
                    pRO.AccountingStartDateString, pRO.HourlyRate3EndDateString);

                pRO.Abrechnungstext1 += String.Format(": {0:0.##} FLS {1}x {2:c}",
                    pRO.GeleisteteFLSMitStundensatz3, pRO.RateFactor == 1 ? "" : "x " + pRO.RateFactorText2 + " ", pRO.HourlyRate3);

                //[AccountingStartDateString] - [HourlyRate3EndDateString] sind [RecordedFLSWithHourlyRate3String] Std. x [HourlyRate3String] € =";

                pRO.Betrag1 = String.Format("{0:c}", pRO.GeleisteteFLSMitStundensatz3 * (decimal)pRO.RateFactor * pRO.HourlyRate3);


                pRO.Abrechnungstext2 = String.Format("{0} bis {1}",
                    pRO.HourlyRateOldStartDateString, pRO.HourlyRateOldEndDateString);
                pRO.Abrechnungstext2 += String.Format(": {0:0.##} FLS {1}x {2:c}",
                    pRO.GeleisteteFLSMitStundensatzAlt, pRO.RateFactor == 1 ? "" : "x " + pRO.RateFactorText2 + " ", pRO.HourlyRateOld);

                pRO.Betrag2 = String.Format("{0:c}", pRO.GeleisteteFLSMitStundensatzAlt * (decimal)pRO.RateFactor * pRO.HourlyRateOld);


                pRO.Abrechnungstext3 = String.Format("{0} bis {1}",
                    pRO.HourlyRateNewStartDateString, pRO.AccountingEndDateString);
                pRO.Abrechnungstext3 += String.Format(": {0:0.##} FLS {1}x {2:c}",
                    pRO.GeleisteteFLSMitStundensatzAktuell, pRO.RateFactor == 1 ? "" : "x " + pRO.RateFactorText2 + " ", pRO.HourlyRateNew);

                pRO.Betrag3 = String.Format("{0:c}", pRO.GeleisteteFLSMitStundensatzAktuell * (decimal)pRO.RateFactor * pRO.HourlyRateNew);
            }
            else if (pRO.DifferentHourlyRateCount == 2)
            {

                pRO.Abrechnungstext2 = String.Format("{0} bis {1}",
                    pRO.AccountingStartDateString, pRO.HourlyRateOldEndDateString);
                pRO.Abrechnungstext2 += String.Format(": {0:0.##} FLS {1}x {2:c}",
                    pRO.GeleisteteFLSMitStundensatzAlt, pRO.RateFactor == 1 ? "" : "x " + pRO.RateFactorText2 + " ", pRO.HourlyRateOld);

                pRO.Betrag2 = String.Format("{0:c}", pRO.GeleisteteFLSMitStundensatzAlt * (decimal)pRO.RateFactor * pRO.HourlyRateOld);


                pRO.Abrechnungstext3 = String.Format("{0} bis {1}",
                    pRO.HourlyRateNewStartDateString, pRO.AccountingEndDateString);
                pRO.Abrechnungstext3 += String.Format(": {0:0.##} FLS {1}x {2:c}",
                    pRO.GeleisteteFLSMitStundensatzAktuell, pRO.RateFactor == 1 ? "" : "x " + pRO.RateFactorText2 + " ", pRO.HourlyRateNew);

                pRO.Betrag3 = String.Format("{0:c}", pRO.GeleisteteFLSMitStundensatzAktuell * (decimal)pRO.RateFactor * pRO.HourlyRateNew);
            }
            else
            {
                pRO.Abrechnungstext3 = String.Format("{0} bis {1}",
                    pRO.AccountingStartDateString, pRO.AccountingEndDateString);
                pRO.Abrechnungstext3 += String.Format(": {0:0.##} FLS {1}x {2:c}",
                    pRO.GeleisteteFLSMitStundensatzAktuell, pRO.RateFactor == 1 ? "" : "x " + pRO.RateFactorText2 + " ", pRO.HourlyRateNew);

                pRO.Betrag3 = String.Format("{0:c}", pRO.GeleisteteFLSMitStundensatzAktuell * (decimal)pRO.RateFactor * pRO.HourlyRateNew);
            }
        }
    }
}
