using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using BeWo.Data.Entities;
using BeWo.Report.ReportObjects;


namespace BeWo.LebenshilfeEssenReports
{
	public class LHEssenMitarbeiterstundenkontoBerechnung : MitarbeiterstundenkontoBerechnung
	{
		private void AddUeberstunden(MitarbeiterstundenkontoRO.EmployeeDetail employeeDetail, decimal stunden, bool auchVormonat)
		{
			if (!employeeDetail.Ueberstunden.HasValue)
			{
				employeeDetail.Ueberstunden = 0;
			}
			if (!employeeDetail.UeberstundenGesamt.HasValue)
			{
				employeeDetail.UeberstundenGesamt = 0;
			}
			if (auchVormonat)
			{
				if (!employeeDetail.UeberstundenVormonat.HasValue)
				{
					employeeDetail.UeberstundenVormonat = 0;
				}
				employeeDetail.UeberstundenVormonat += stunden;
			}
			employeeDetail.UeberstundenGesamt += stunden;
		}

		public override bool ShouldCreateDayDetails()
		{
			return true;
		}

		public override bool AddServiceRecordToDuration(ServiceRecord item)
		{
			if (item.ServiceDescription.Name.ToLower().Contains("krankheit") || item.ServiceDescription.Name.ToLower().Contains("urlaub"))
			{
				return false;
			}
			if (item.ServiceDescription.ServiceCategory.Name.ToLower().Contains("krisenintervention") ||
			    item.ServiceDescription.ServiceCategory.Name.ToLower().Contains("besondere auffälligkeiten"))
			{
				return false;
			}
			return base.AddServiceRecordToDuration(item);
		}

		public override void CreateEmployeeDetails(MitarbeiterstundenkontoRO ro)
		{
			base.CreateEmployeeDetails(ro);
			foreach (var ed in ro.EmployeeDetailList)
			{
				if (ed.UrlaubUndKrankheit.HasValue)
					ed.StundenGesamtIst += (ed.UrlaubUndKrankheit.Value*ed.SollProTag);
			}

			if (ro.ReportStartDate >= new DateTime(2014, 10, 1))
			{
				bool auchVormonat = true;
				foreach (var employeeDetail in ro.EmployeeDetailList)
				{
					


					if (employeeDetail.LastName == "Jordan")
					{
						AddUeberstunden(employeeDetail, -22.40m, auchVormonat);
					}
					else if (employeeDetail.LastName == "Proc")
					{
						AddUeberstunden(employeeDetail, -3.92m, auchVormonat);
					}
					else if (employeeDetail.LastName == "Sunderbrink")
					{
						AddUeberstunden(employeeDetail, -22.43m, auchVormonat);
					}
					else if (employeeDetail.LastName == "Jarisch")
					{
						AddUeberstunden(employeeDetail, -16.67m, auchVormonat);
					}
					else if (employeeDetail.LastName == "Gormanns")
					{
						AddUeberstunden(employeeDetail, -5.75m, auchVormonat);
					}
					
				}
			}
		}

		public override decimal GetAdditionalHours(IList<MitarbeiterstundenkontoRO.DayDetail> days, DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList<ServiceRecord> recordsAll)
		{
			var ah = base.GetAdditionalHours(days, berichtStart, berichtEnde, ed, recordsAll);

			foreach (var sr in recordsAll)
			{
				if (sr.Start.HasValue && sr.Start >= berichtStart && sr.Start < berichtEnde && sr.End.HasValue)
				{
					var addKrank = false;
					var addUrlaub = false;

					//var dayDetail = FindDayDetail(sr, days);

					var day = sr.Start.Value;
					var dayDetail = days.FirstOrDefault(dd => dd.Date.Day == day.Day);

					var faktor = GetFeiertagsFaktor(day);
					if (faktor < 1 && day.DayOfWeek != DayOfWeek.Saturday && day.DayOfWeek != DayOfWeek.Sunday)
					{
						if (sr.ServiceDescription.Name.ToLower().Contains("krankheit"))
						{
							if (dayDetail.HoursSick == 0)
							{
								addKrank = true;

							}
						}
						else if (sr.ServiceDescription.Name.ToLower().Contains("urlaub"))
						{
							if (dayDetail.HoursInVacation == 0)
							{
								addUrlaub = true;

							}
						}

						if (addKrank || addUrlaub)
						{
							if (addKrank)
								dayDetail.HoursSick += sr.RoundedDuration / 60;
							else
								dayDetail.HoursInVacation += sr.RoundedDuration / 60;

							//if (!ed.UrlaubUndKrankheit.HasValue)
							//ed.UrlaubUndKrankheit = 0;


							if (sr.RoundedDuration <= (ed.SollProTag * 60))
							{
								//ed.UrlaubUndKrankheit += ((sr.RoundedDuration / 60) / ed.SollProTag);
								dayDetail.MinutesTotal += sr.RoundedDuration;
								ah += sr.RoundedDuration / 60;
							}

							else
							{
								//ed.UrlaubUndKrankheit += 1;
								dayDetail.MinutesTotal += (ed.SollProTag * 60);
								ah += ed.SollProTag;
							}

						}
					}
					
					
				}
			}
			return ah;
		}

		public override List<DateTime> GetFeiertage(int year)
		{
			var list = base.GetFeiertage(year);

			list.Add(new DateTime(year, 12, 31));

			return list;
		}

		public override decimal GetFeiertagsFaktor(DateTime start)
		{
			if (start.Month == 12 && start.Day == 24)
			{
				return 0.5m;
			}
			if (start.Month == 12 && start.Day == 31)
			{
				return 0.5m;
			}
			return base.GetFeiertagsFaktor(start);
		}

		public override IList<MitarbeiterstundenkontoRO.DayDetail> CreateDayDetails(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList<ServiceRecord> recordsAll)
		{
			var ddList = base.CreateDayDetails(berichtStart, berichtEnde, ed, recordsAll);


			return ddList;
		}

	}
}
