using SewerStammGen.Shared.Contracts;
using SewerStammGen.Shared.Domain;
using Shared.Contracts;
using StammGenerator.Commands;
using StammGenerator.ViewModel;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using WWTech_KanalSchnittstelle.Exporter;

namespace StammGenerator.Commands
{
    internal class ProjectExportCommand : AsyncCommandBase
    {
        private readonly IActualState _actualState;
        private readonly IHaltungDataService _haltungDataService;
        private readonly ISchachtDataService _schachtDataService;
        private readonly IProjektDataService _projektDataService;

        public ProjectExportCommand(IActualState actualState, IHaltungDataService haltungDataService, ISchachtDataService schachtDataService, IProjektDataService projektDataService)
        {
            _actualState = actualState;
            _haltungDataService = haltungDataService;
            _schachtDataService = schachtDataService;
            _projektDataService = projektDataService;
        }

        public override async Task ExecuteAsync(object? parameter)
        {
            Projekt prj = await _projektDataService.Get(_actualState.ProjektID);

            try
            {
                IExport export = ExporterFactory.Export(prj.ExportType);
                IEnumerable<Kanal> haltungen = await _haltungDataService.GetAllByProjekt(prj);
                IEnumerable<Schacht> schaechte = await _schachtDataService.GetAllByProjekt(prj);

                await export.Export(_actualState.ProjektID.ToString(), prj.Kodierungssystem, haltungen.ToList(), schaechte.ToList());
            }
            catch(NotImplementedException)
            {
                MessageBoxResult result = MessageBox.Show(string.Format("Schnittstelle Export format: {0} ist nicht Implementiert", prj.ExportType), "Fehlende Implementation", MessageBoxButton.OK, MessageBoxImage.Exclamation);
            }
        }
    }
}
