using SewerStammGen.DAL.Services.PostgresqlData;
using SewerStammGen.Shared.Contracts;
using SewerStammGen.Shared.Domain;
using Shared.Contracts;

using StammGenerator.Interface;
using StammGenerator.Views;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows;
using System.Windows.Input;

namespace StammGenerator.ViewModel
{
    internal class ProjektEditViewModel : BaseViewModel
    {
        private Projekt _model;
        private int ProjektID;
        private readonly IDataService<Projekt> _projectDataService;
        private readonly IAuftraggeberDataService _auftraggeberDataService;
        private Auftraggeber auftraggeber = new Auftraggeber();
        private readonly IRenavigator _renavigator;
        private bool AuftraggeberChanged = false;

        public ProjektSettingsViewModel ProjektSettingsViewModel { get; set; }

        public ICommand Speichern { get; set; }
        public ICommand AuftraggeberChange { get; set; }

        public Auftraggeber Auftraggeber
        {
            get => _model.Auftraggeber;
            set
            {
                if(_model.Auftraggeber == value) return;
                _model.Auftraggeber = value;
                OnPropertyChanged();
            }
        }
        

        public string ProjektName
        {
            get => _model.Projektname;
            set
            {
                if(_model.Projektname != value)
                {
                    _model.Projektname = value;
                    OnPropertyChanged();
                }
            }
        }
        public string Erstelldatum 
        {
            get => _model.Erstelldatum;
            set
            {
                if (_model.Erstelldatum != value)
                {
                    _model.Erstelldatum = 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 ProjektEditViewModel(IProjektDataService projektDataService,IAuftraggeberDataService auftraggeberDataService,  IActualState actualState, IRenavigator renavigator)
        {
            _projectDataService = projektDataService;
            _auftraggeberDataService = auftraggeberDataService;
            _renavigator = renavigator;

            ProjektID = actualState.ProjektID;

            _model = new Projekt();
            Speichern = new RelayCommand((x) => this.SaveProject());
            AuftraggeberChange = new RelayCommand((x) => this.ChangeAuftraggeber());
            this.ProjektSettingsViewModel = new ProjektSettingsViewModel();


            LoadProjekt();

            
            
        }

        private void ChangeAuftraggeber()
        {
            var win = new AuftraggeberShow();
            win.DataContext = new AuftraggeberEditFrmViewModel(_model.Auftraggeber, _auftraggeberDataService);
            win.Closed += AuftraggeberWin_Closed;
            win.ShowDialog();
            
        }

        private void AuftraggeberWin_Closed(object? sender, EventArgs e)
        {
            OnPropertyChanged(nameof(Auftraggeber));
            AuftraggeberShow? shw = sender as AuftraggeberShow;
            if (shw == null) return; 
            AuftraggeberEditFrmViewModel? mdl = shw.DataContext as AuftraggeberEditFrmViewModel;
            if (mdl == null) return;
            if (mdl.SelectedAuftraggber == null) return;

            if (!_model.Auftraggeber.Id.Equals(mdl.SelectedAuftraggber.Id))
            {
                _model.Auftraggeber = mdl.SelectedAuftraggber;
                AuftraggeberChanged = true;
            }
            OnPropertyChanged(nameof(Auftraggeber));
        }

        private async void LoadProjekt()
        {

            _model = await _projectDataService.Get(ProjektID);
            if(_model == null)
            {
                _model = new Projekt()
                {
                    Auftraggeber = new Auftraggeber(),
                };
            }
            
            this.ProjektSettingsViewModel.Projekt = _model;
            OnPropertyChanged(nameof(ProjektName));
            OnPropertyChanged(nameof(Erstelldatum));
            OnPropertyChanged(nameof(Strasse));
            OnPropertyChanged(nameof(Ort));
            OnPropertyChanged(nameof(ProjektSettingsViewModel));
            OnPropertyChanged(nameof(Auftraggeber));
            
        }

        private void SaveProject()
        {
            // TODO: Zur Zeit ohne Funktion da die Klasse so nicht bearbeitet wird. State geht verloren
            //if (_model.AuftraggeberTemporar && !_model.Auftraggeber.DataChanged)
            //    ChangeAuftraggeber();
            if (_model.Auftraggeber.DataChanged && !AuftraggeberChanged)
                _auftraggeberDataService.Update(_model.Auftraggeber);
            _projectDataService.Update(_model);

            _renavigator.Renavigate();
        }
    }
}
