using SewerStammGen.Shared.Contracts;
using SewerStammGen.Shared.Domain;
using Shared.Contracts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace StammGenerator.ViewModel
{
    class AuftraggeberEditFrmViewModel : BaseViewModel
    {
        Auftraggeber _model;
        public string Name
        {
            get => _model.Name;
            set
            {
                if(_model.Name != value)
                {
                    _model.Name = value;
                    OnPropertyChanged();
                }
            }
        }
        public string Strasse
        {
            get => _model.Strasse;
            set
            {
                if(_model.Strasse != value)
                {
                    _model.Strasse = value;
                    OnPropertyChanged();
                }
            }
        }
        public string Ort
        {
            get => _model.Ort;
            set
            {
                if(_model.Ort != value)
                {
                    _model.Ort = value;
                    OnPropertyChanged();
                }
            }
        }
        public string Postleitzahl
        {
            get => _model.Postleitzahl;
            set
            {
                if(_model.Postleitzahl != value)
                {
                    _model.Postleitzahl = value;
                    OnPropertyChanged();
                }
            }
        }
        public string Telefonnummer
        {
            get => _model.Telefonnummer;
            set
            {
                if(_model.Telefonnummer != value)
                {
                    _model.Telefonnummer = value;
                    OnPropertyChanged();
                }
            }
        }
        public string Ansprechpartner
        {
            get => _model.Ansprechpartner;
            set
            {
                if(_model.Ansprechpartner  != value)
                {
                    _model.Ansprechpartner = value;
                    OnPropertyChanged();
                }
            }
        }

        public Auftraggeber? SelectedAuftraggber { get; set; } = null;

        public ICommand ApplyCommand { get; set; }

        private readonly IAuftraggeberDataService _auftraggeberDataService;

        private IList<Auftraggeber> verfuegbareAuftraggeber = new List<Auftraggeber>();
        public IList<Auftraggeber> VerfuegbareAuftraggeber
        {
            get => verfuegbareAuftraggeber;
            set
            {
                verfuegbareAuftraggeber = value;
                OnPropertyChanged();
            }
        }

        protected override void OnPropertyChanged([CallerMemberName] string? propertyName = null)
        {
            _model.DataChanged = true;
            base.OnPropertyChanged(propertyName);
        }

        public AuftraggeberEditFrmViewModel(Auftraggeber model, IAuftraggeberDataService auftraggeberDataService)
        {
            _model = model;
            _auftraggeberDataService = auftraggeberDataService;
            ApplyCommand = new RelayCommand((x) => this.Apply());


            LoadAuftraggebers();
        }

        private void Apply()
        {
            if (SelectedAuftraggber == null) return;
            _model = SelectedAuftraggber;
            OnPropertyChanged(nameof(Name));
            OnPropertyChanged(nameof(Strasse));
            OnPropertyChanged(nameof(Ort));
            OnPropertyChanged(nameof(Postleitzahl));
            OnPropertyChanged(nameof(Telefonnummer));
            OnPropertyChanged(nameof(Ansprechpartner));
        }

        private async void LoadAuftraggebers()
        {
            VerfuegbareAuftraggeber.Clear();
            IEnumerable<Auftraggeber> s = await _auftraggeberDataService.GetAll();
            VerfuegbareAuftraggeber = s.ToList();
            OnPropertyChanged(nameof(VerfuegbareAuftraggeber));
            
        }
    }

}
