using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Windows;

using BeWo.Annotations;

using BS.Shared;
using BS.Shared.Core;
using BS.Shared.Extensions;

namespace BeWo.View.Controls
{
    public partial class BehinderungsartenSelectionControl
    {
        public static readonly DependencyProperty AusgewaehlteBehinderungsartenProperty = DependencyProperty.Register("AusgewaehlteBehinderungsarten", typeof(ObservableCollection<Behinderungsart>), typeof(BehinderungsartenSelectionControl));
        public ObservableCollection<Behinderungsart> AusgewaehlteBehinderungsarten
        {
            get { return (ObservableCollection<Behinderungsart>)GetValue(AusgewaehlteBehinderungsartenProperty); }
            set { SetValue(AusgewaehlteBehinderungsartenProperty, value); }
        }

        public static readonly DependencyProperty AusgewaehlteBehinderungsartenStringProperty = DependencyProperty.Register("AusgewaehlteBehinderungsartenString", typeof(String), typeof(BehinderungsartenSelectionControl));
        public String AusgewaehlteBehinderungsartenString
        {
            get { return (String) GetValue(AusgewaehlteBehinderungsartenStringProperty); }
            set { SetValue(AusgewaehlteBehinderungsartenStringProperty, value); }
        }

        private ObservableCollection<Behinderungsart> _behinderungsartenSourceListe;
        public ObservableCollection<Behinderungsart> BehinderungsartenSourceListe
        {
            get { return _behinderungsartenSourceListe; }
            set
            {
                _behinderungsartenSourceListe = value;
                PossibleBehinderungsarten.DoForEach(dfe =>
                {
                    if (_behinderungsartenSourceListe != null && _behinderungsartenSourceListe.Contains(dfe.Behinderungsart))
                    {
                        dfe.IsChecked = true;
                    }
                });

                InitBehinderungsartenString();
            }
        }

        private void InitBehinderungsartenString()
        {
            var toolTipText = PossibleBehinderungsarten.Where(w => w.IsChecked).Aggregate(String.Empty, (current, item) => current + String.Format("{0}; ", item.Name));

            AusgewaehlteBehinderungsartenString = toolTipText.TrimEnd(new[] { ' ', ';' });
        }

        private readonly ObservableCollection<BehinderungsartenListBoxItem> _PossibleBehinderungsarten = new ObservableCollection<BehinderungsartenListBoxItem>
        {
            new BehinderungsartenListBoxItem(Behinderungsart.Blindheit),
            new BehinderungsartenListBoxItem(Behinderungsart.Epilepsie),
            new BehinderungsartenListBoxItem(Behinderungsart.Gehoerlosigkeit),
            new BehinderungsartenListBoxItem(Behinderungsart.GeistigeBehinderung),
            new BehinderungsartenListBoxItem(Behinderungsart.Hoerbehinderung),
            new BehinderungsartenListBoxItem(Behinderungsart.InnereErkrankungen),
            new BehinderungsartenListBoxItem(Behinderungsart.Koerperbehinderung),
            new BehinderungsartenListBoxItem(Behinderungsart.Lernbehinderung),
            new BehinderungsartenListBoxItem(Behinderungsart.PsychischeErkrankungen),
            new BehinderungsartenListBoxItem(Behinderungsart.Sehbehinderung),
            new BehinderungsartenListBoxItem(Behinderungsart.Suchtkrankheiten)
        };

        public IEnumerable<BehinderungsartenListBoxItem> PossibleBehinderungsarten
        {
            get { return _PossibleBehinderungsarten; }
        }

        public BehinderungsartenSelectionControl()
        {
            DataContext = this;
            InitializeComponent();
        }

        private void BehinderungsartCB_OnChecked(object sender, RoutedEventArgs e)
        {
            InitBehinderungsartenString();

            AusgewaehlteBehinderungsarten = PossibleBehinderungsarten.Where(w => w.IsChecked).Select(s => s.Behinderungsart).ToObservableCollection();
        }
    }

    public class BehinderungsartenListBoxItem : INotifyPropertyChanged
    {
        private bool _IsChecked;
        public bool IsChecked
        {
            get { return _IsChecked; }
            set
            {
                _IsChecked = value;
                OnPropertyChanged("IsChecked");
            }
        }

        public String Name { get { return EnumTranslations.BehinderungsartTranslations[Behinderungsart]; } }

        public Behinderungsart Behinderungsart { get; set; }

        public event PropertyChangedEventHandler PropertyChanged;

        public BehinderungsartenListBoxItem(Behinderungsart pBehinderungsart)
        {
            Behinderungsart = pBehinderungsart;
        }

        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
