using System;
using System.Collections.Generic;
using System.Linq;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Report.ReportObjects;
using BeWo.Service.ServiceImplementations;
using BS.Shared.Extensions;


namespace BeWo.LebenshilfeWuerzburgReports
{
	public class CustomMitarbeiterstundenkontoBerechnung : MitarbeiterstundenkontoBerechnung
	{
		public override void CreateEmployeeDetails(MitarbeiterstundenkontoRO ro)
		{
			foreach (var empDetail in ro.EmployeeDetailList)
			{
				DateTime monatsAnfang = ro.ReportStartDate;
				DateTime monatsEnde = monatsAnfang.AddMonths(1);
				
				Employee emp = empDetail.Employee;


//-	Direkte Zeiten
//-	Indirekte Zeiten
//-	Allgemein
//-	Ausfallzeit
				decimal direkteZeit = 0;
				decimal indirekteZeit = 0;
				decimal allgemeineZeit = 0;
				decimal ausfallZeit = 0;
				decimal gesamtZeit = 0;

				IList<ServiceRecord> recordsAll = DAOFactory.SearchDAO.FindServiceRecords(emp.Oid, null);
				recordsAll = AnalysisServiceImp.FilterActiveServiceRecords(recordsAll);

				IList<ServiceRecord> recordsThisMonth = new List<ServiceRecord>();
				IList<ServiceRecord> groupFilteredRecords = new List<ServiceRecord>();
				Dictionary<long, bool> groupBookingDict = new Dictionary<long, bool>();
				foreach (var item in recordsAll)
				{

					if (!item.GroupOid.HasValue || !groupBookingDict.ContainsKey(item.GroupOid.Value))
					{
						groupFilteredRecords.Add(item);
						if (item.GroupOid.HasValue)
						{
							groupBookingDict.Add(item.GroupOid.Value, true);
						}
					}
				}

				foreach (var item in groupFilteredRecords)
				{

					if (item.Start.Value >= monatsAnfang && item.Start.Value < monatsEnde)
					{

						decimal duration = 0;

						if (item.GroupRoundedDuration.HasValue)
						{
							duration = item.GroupRoundedDuration.Value;
						}
						else
						{
							duration = item.RoundedDuration;
						}
//ServiceCategory
//7 Direkte Leistung
//9 Indirekte Leistung
//11 Allgemein

//ServiceDescription
//88 Ausfallzeit ServiceCategoryOid = 7
						if (item.ServiceDescription != null && item.ServiceDescription.ServiceCategory != null)
						{
							if (item.ServiceDescription.Name == "Ausfallzeit")
							{
								ausfallZeit += duration;
							}
							else if (item.ServiceDescription.ServiceCategory.Name == "Direkte Leistung")
							{
								direkteZeit += duration;
							}
							else if (item.ServiceDescription.ServiceCategory.Name == "Indirekte Leistung")
							{
								indirekteZeit += duration;
							}
							else if (item.ServiceDescription.ServiceCategory.Name == "Allgemein")
							{
								allgemeineZeit += duration;
							}
						}
						gesamtZeit += duration;
							
						recordsThisMonth.Add(item);
					}


				}


				ausfallZeit /= 60m;
				direkteZeit /= 60m;
				indirekteZeit /= 60m;
				allgemeineZeit /= 60m;
				gesamtZeit /= 60m;

				empDetail.FlsSoll = direkteZeit;
				empDetail.FlsIst = indirekteZeit;
				empDetail.FlsDiff = allgemeineZeit;
				empDetail.MittelbarIst = ausfallZeit;
				empDetail.StundenGesamtIst = gesamtZeit;

			}
		}
	}
}
