using SewerStammGen.Shared.Domain;
using SewerStammGen.Shared.Enum;
using Shared.Contracts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WWTech_KanalSchnittstelle.Importer
{
    internal enum EKennung
    {
        DECKEL = 1,
        SOHLE = 2
    }
    public class CSVImporter : IImport
    {
        private string[] input;
        private readonly Projekt projekt;

#pragma warning disable CS8618 // Ein Non-Nullable-Feld muss beim Beenden des Konstruktors einen Wert ungleich NULL enthalten. Erwägen Sie die Deklaration als Nullable.
        public CSVImporter(int projektID)
#pragma warning restore CS8618 // Ein Non-Nullable-Feld muss beim Beenden des Konstruktors einen Wert ungleich NULL enthalten. Erwägen Sie die Deklaration als Nullable.
        {
            projekt = new Projekt() {  Id = projektID };
        }
        public List<Schacht> LoadSchaechte(string filename, EEntwaeserung entwaeserung)
        {
            List<Schacht> result = new List<Schacht>();

            if(!File.Exists(filename))
            {
                throw new FileNotFoundException(filename);
            }

            input = File.ReadAllLines(filename);
            int zeile = -1;

            foreach (string line in input)
            {
                zeile++;
                if (zeile == 0) continue;
                string[] parsed = line.Split(new char[] { ';' });

                string objektbezeichnung = parsed[0];

                string objektname = objektbezeichnung.Substring(0, objektbezeichnung.Length - 2);
                EKennung kennung = (EKennung)Convert.ToInt32(objektbezeichnung.Substring(objektbezeichnung.Length - 2, 2));

                bool neueSchacht = false;
                Schacht? schacht = result.FindLast(x => x.Objektbezeichnung.Equals(objektname) && x.Projekt.Id.Equals(projekt.Id));
                if (schacht == null)
                {
                    schacht = new Schacht();
                    neueSchacht = true;
                }

                if(kennung == EKennung.DECKEL)
                {
                    schacht.DeckelRechtsWert = decimal.Parse(parsed[1].Replace('.', ','));
                    schacht.DeckelHochWert = decimal.Parse(parsed[2].Replace('.', ','));
                    schacht.DeckelHoehe = decimal.Parse(parsed[3].Replace('.', ','));
                }
                if(kennung == EKennung.SOHLE)
                {
                    schacht.SohlRechtsWert = decimal.Parse(parsed[1].Replace('.', ','));
                    schacht.SohlHochWert = decimal.Parse(parsed[2].Replace('.', ','));
                    schacht.SohlHoehe = decimal.Parse(parsed[3].Replace('.', ','));
                }


                schacht.Projekt = projekt;
                schacht.Entwaesserung = entwaeserung;
                schacht.Vermesser = "Marwede";
                schacht.AufnahmeDatum = DateTime.Now.ToShortDateString();

                if (neueSchacht)
                {
                    schacht.Objektbezeichnung = objektname;
                    result.Add(schacht);
                }
            }
            return result;
        }
    }
}
