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 MerkzeichenSelectionControl
    {
        public static readonly DependencyProperty AusgewaehlteMerkzeichenProperty = DependencyProperty.Register("AusgewaehlteMerkzeichen", typeof(ObservableCollection<Merkzeichen>), typeof(MerkzeichenSelectionControl));
        public ObservableCollection<Merkzeichen> AusgewaehlteMerkzeichen
        {
            get { return (ObservableCollection<Merkzeichen>)GetValue(AusgewaehlteMerkzeichenProperty); }
            set { SetValue(AusgewaehlteMerkzeichenProperty, value); }
        }

        public static readonly DependencyProperty AusgewaehlteMerkzeichenStringProperty = DependencyProperty.Register("AusgewaehlteMerkzeichenString", typeof(String), typeof(MerkzeichenSelectionControl));
        public String AusgewaehlteMerkzeichenString
        {
            get { return (String)GetValue(AusgewaehlteMerkzeichenStringProperty); }
            set { SetValue(AusgewaehlteMerkzeichenStringProperty, value); }
        }

        private ObservableCollection<Merkzeichen> _merkzeichenSourceListe;
        public ObservableCollection<Merkzeichen> MerkzeichenSourceListe
        {
            get { return _merkzeichenSourceListe; }
            set
            {
                _merkzeichenSourceListe = value;
                PossibleMerkzeichen.DoForEach(dfe =>
                {
                    if (_merkzeichenSourceListe != null && _merkzeichenSourceListe.Contains(dfe.Merkzeichen))
                    {
                        dfe.IsChecked = true;
                    }
                });

                InitMerkzeichenString();
            }
        }

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

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

        private readonly ObservableCollection<MerkzeichenListBoxItem> _PossibleMerkzeichen = new ObservableCollection<MerkzeichenListBoxItem>
        {
            new MerkzeichenListBoxItem(Merkzeichen.aG),
            new MerkzeichenListBoxItem(Merkzeichen.B),
            new MerkzeichenListBoxItem(Merkzeichen.Bl),
            new MerkzeichenListBoxItem(Merkzeichen.G),
            new MerkzeichenListBoxItem(Merkzeichen.Gl),
            new MerkzeichenListBoxItem(Merkzeichen.H),
            new MerkzeichenListBoxItem(Merkzeichen.Kl1),
            new MerkzeichenListBoxItem(Merkzeichen.RF)
        };

        public IEnumerable<MerkzeichenListBoxItem> PossibleMerkzeichen
        {
            get { return _PossibleMerkzeichen; }
        }

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

        private void MerkzeichenCB_OnChecked(object sender, RoutedEventArgs e)
        {
            InitMerkzeichenString();

            AusgewaehlteMerkzeichen = PossibleMerkzeichen.Where(w => w.IsChecked).Select(s => s.Merkzeichen).ToObservableCollection();
        }
    }

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

        public String Name { get { return EnumTranslations.MerkzeichenTranslations[Merkzeichen]; } }

        public Merkzeichen Merkzeichen { get; set; }

        public event PropertyChangedEventHandler PropertyChanged;

        public MerkzeichenListBoxItem(Merkzeichen pMerkzeichen)
        {
            Merkzeichen = pMerkzeichen;
        }

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