using System;
using System.Collections.Generic;
using System.Linq;

using BeWo.Data.Entities;

using BS.Shared;
using BS.Shared.DataContracts;

namespace BeWo.Report.ReportObjects
{
	public class KassenbuchRO : AbstractBeWoReportObject<KassenbuchRO>
	{
		public List<ZeilenObjekt> Transaktionen  { get; set; }
		public DateTime           Zeitraum       { get; set; }
		public decimal            Anfangsbestand { get; set; }
        public string             Kassenname     { get; set; }
        public string             Beguenstigter  { get; set; }
        public string             ReportTitle    { get; set; }

        public static KassenbuchRO Create(DateTime pZeitraum, BargeldkassenDC pBargeldkasse, BeWoEntityBase pBeguenstigter)
        {
            var beguenstigter = string.Empty;

            if (pBeguenstigter is Customer)
            {
                var customer = (Customer) pBeguenstigter;

                beguenstigter = customer.Person.FirstNameLastName;
            }
            
            var t = pBargeldkasse.Bargeldtransaktionen.Where(w => w.Zahlungsdatum != null && w.Zahlungsdatum.Value.Year == pZeitraum.Year && w.Zahlungsdatum.Value.Month == pZeitraum.Month).OrderByDescending(o => o.Zahlungsdatum).Select(tDC => new ZeilenObjekt
			{
				Einzahlung = tDC.Zahlungstyp == Zahlungstyp.Einzahlung && tDC.Betrag != null ? tDC.Betrag.Value : 0, 
				Auszahlung = tDC.Zahlungstyp == Zahlungstyp.Auszahlung && tDC.Betrag != null ? tDC.Betrag.Value : 0, 
				Bestand    = tDC.Transaktionskassenbestand.Value, 
				Belegdatum = tDC.Zahlungsdatum.Value,
                Notiz      = tDC.Notice
			}).ToList();

            var ersteTransaktion = pBargeldkasse.Bargeldtransaktionen.OrderBy(o => o.Zahlungsdatum).ToList()[0];

			return new KassenbuchRO
			{
                Kassenname     = pBargeldkasse.Kassenname,
                Beguenstigter  = beguenstigter,
				Zeitraum       = pZeitraum,
				Transaktionen  = t,
				Anfangsbestand = ersteTransaktion.Transaktionskassenbestand.Value - ersteTransaktion.Betrag.Value * (ersteTransaktion.Zahlungstyp == Zahlungstyp.Einzahlung ? 1 : -1),
                ReportTitle = string.Format("Kassenbuch \"{0}\" {1}{2}", pBargeldkasse.Kassenname, pZeitraum.ToString("MMMM yyyy"), (pBeguenstigter == null ? string.Empty : string.Format(" von {0}", beguenstigter)))
			};
		}
	}

	public struct ZeilenObjekt
	{
		public decimal   Einzahlung { get; set; }
		public decimal   Auszahlung { get; set; }
		public decimal   Bestand    { get; set; }
		public DateTime? Belegdatum { get; set; }
        public string    Notiz      { get; set; }
	}
}