using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Windows.Data;

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

namespace BeWo.Scheduler.Converter
{
	public class CheckBoxConverter : IMultiValueConverter
	{
		public List<CompactEmployeeDC> SelektierteMitarbeiter = new List<CompactEmployeeDC>();
		public List<CompactCustomerDC> SelektierteKlienten    = new List<CompactCustomerDC>();
		public List<ResourceDC>        SelektierteRessourcen  = new List<ResourceDC>();

		public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
		{
			if (values.Length < 2)
			{
			    return false;
			}

			var mitarbeiterKlientRessource = values[0];

			switch (parameter.ToString())
			{
				case "Mitarbeiter":
					var liste = (List<CompactEmployeeDC>)values[1];
					SelektierteMitarbeiter = new List<CompactEmployeeDC>(liste);

					if (liste != null && liste.Count > 0)
					{
					    return liste.Any(em => em.EmployeeOid.Equals(mitarbeiterKlientRessource));
					}

					break;
				case "Klienten":
					var liste2 = (List<CompactCustomerDC>)values[1];
					SelektierteKlienten = new List<CompactCustomerDC>(liste2);

					if (liste2 != null && liste2.Count > 0)
					{
					    return liste2.Any(c => c != null && c.CustomerOid.Equals(mitarbeiterKlientRessource));
					}

					break;
				case "Ressourcen":
					var liste3 = (List<ResourceDC>)values[1];
					SelektierteRessourcen = new List<ResourceDC>(liste3);

					if (liste3 != null && liste3.Count > 0)
					{
					    return liste3.Any(r => r.ResourceOid.Equals(mitarbeiterKlientRessource));
					}

					break;
			}

			return false;
		}

		public CompactEmployeeDC AktuellerMitarbeiter { get; set; }
		public CompactCustomerDC AktuellerKlient      { get; set; }
		public ResourceDC        AktuelleRessource    { get; set; }

		public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
		{
			var abc = new object[2];

			switch (parameter.ToString())
			{
				case "Mitarbeiter":
					abc[0] = AktuellerMitarbeiter.EmployeeOid;

					if (!((bool)value))
					{
					    SelektierteMitarbeiter.Remove(AktuellerMitarbeiter);
					}
					else if (!SelektierteMitarbeiter.Contains(AktuellerMitarbeiter))
					{
					    SelektierteMitarbeiter.Add(AktuellerMitarbeiter);
					}

					abc[1] = SelektierteMitarbeiter;
					break;
				case "Klienten":
					abc[0] = AktuellerKlient.CustomerOid;

					if (!((bool)value))
					{
					    SelektierteKlienten.Remove(AktuellerKlient);
					}
					else if (!SelektierteKlienten.Contains(AktuellerKlient))
					{
					    SelektierteKlienten.Add(AktuellerKlient);
					}

					abc[1] = SelektierteKlienten;
					break;
				case "Ressourcen":
					abc[0] = AktuelleRessource.ResourceOid;

					if (!((bool)value))
					{
					    SelektierteRessourcen.Remove(AktuelleRessource);
					}
					else if (!SelektierteRessourcen.Contains(AktuelleRessource))
					{
					    SelektierteRessourcen.Add(AktuelleRessource);
					}

					abc[1] = SelektierteRessourcen;
					break;
			}

			return abc;
		}
	}
}
