using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using GCHR.Model;
using GCHR.Model.Konto;
using GCHR.View;

namespace GCHR.Control.Tasks
{
    class TaskManager
    {
        public ThreadXData Data = ThreadXData.CreateInstance();
        private List<Task> _taskList;
        private Konfiguration _config;

        public void CreateTasks(RunWorkerCompletedEventHandler completed, Periode periode)
        {
            HaendlerKonto.AktuellePeriode = periode;
            
            _config = Konfiguration.CreateInstance(Constants.ConfigDatei, Constants.KontenDatei);
            Data.SetDepartmentCase(CreateDepartmentCaseInstance());

            completed += Ablaufsteuerung;

            _taskList = new List<Task> {
                            Task.CreateInstance(0, "Kontenrahmen",     completed, new[] { -1 }),
                            Task.CreateInstance(1, "UebersetzungSuSa", completed, new[] { 0 }),
                            Task.CreateInstance(2, "UebersetzungStat", completed, new[] { 0 }),
                            Task.CreateInstance(3, "ManuelleKonten",   completed, new[] { 2 }),
                            Task.CreateInstance(4, "DatenimportSuSa",  completed, new[] { 1, 2 }),
                            Task.CreateInstance(5, "DatenimportStat",  completed, new[] { 4 }),
                            Task.CreateInstance(6, "Verarbeitung",     completed, new[] { 5 }),
                            Task.CreateInstance(7, "Verrechnung",      completed, new[] { 3 }),
                            Task.CreateInstance(8, "Export",           completed, new[] { 7 })
            };

            Logger.ExportLog = _config.LogDatei;
            Logger.Info(string.Format("Prozess gestartet. Weitere Infos siehe '{0}'", Logger.ExportLog));
            Logger.Progress(DateTime.Now + " Prozess gestartet.");
        }

        private void Ablaufsteuerung(object s, RunWorkerCompletedEventArgs e)
        {
            var aktuellerWorker = (BackgroundWorker)s;
            var aktuelleAufgabe = GetAufgabeByWorker(aktuellerWorker);

            if (e.Error == null)
            {
                if (aktuelleAufgabe.Ampel != null && aktuelleAufgabe.Ampel.Message.Equals(""))
                {
                    aktuelleAufgabe.Ampel.Message = "Die Verarbeitung war erfolgreich.";
                }
                SetWorkerCompleted(aktuelleAufgabe.ID);
                var weitereAufgabe = TryRunNextWorker();

                if (!weitereAufgabe)
                {
                    _config.Speichern();
                }
            }
            else
            {
                if (aktuelleAufgabe.Ampel != null)
                {
                    aktuelleAufgabe.Ampel.Status = Ampelstatus.Rot;
                    aktuelleAufgabe.Ampel.Message += e.Error.Message;
                }
                Logger.Info(e.Error.ToString());
                Logger.Progress(e.Error.ToString());
            }
        }

        public Task GetAufgabeByWorker(BackgroundWorker worker)
        {
            var aufgabe = (from a in _taskList
                           where a.Worker == worker
                           select a).First();

            return aufgabe;
        }

        private void SetWorkerCompleted(int aufgabeId)
        {
            foreach (var aufgabe in _taskList)
            {
                aufgabe.WartelisteAktualisieren(aufgabeId);
            }
        }

        public bool TryRunNextWorker()
        {
            return (_taskList.Where(aufgabe => aufgabe.TryRun())).Count() > 0;
        }
        
        public void RegisterAmpeln(Ampel[] ampeln)
        {
            for (var i = 0; i < Math.Min(ampeln.Count(), _taskList.Count); i++)
            {
                _taskList[i].RegisterAmpel(ampeln[i]);
            }
        }

        private DepartmentCase CreateDepartmentCaseInstance()
        {
            return new DepartmentCase(_config.Hauptmarke, _config.Hauptbetrieb, _config.BilanzMarke, _config.BilanzBetrieb, _config.HerstellerKontenrahmenZiffern);
        }
    }
}