using System.Collections.Generic;
using System;
using System.Linq;
using CalculationBackend.Model.Tables;

namespace CalculationBackend.Model.ImportExport
{
    public class SiaRecordGGroup
    {
        public List<SiaRecordG> Records { get; set; } = new List<SiaRecordG>();
        public List<Unterposition> Unterpositionen { get; set; } = new List<Unterposition>();
        public string Kapitelnummer { get; set; }
        public string Leistungsposition { get; set; }
        public string? Positionstext { get; set; }
        public string? Überschrift { get; set; }
        public string? Mengeneinheit { get; set; }
        public decimal? Menge { get; set; }
        public decimal? Preis { get; set; }

        public class Unterposition
        {
            public string? Objektgliederung { get; set; }
            public string? Positionslage { get; set; }
            public string? Mengenart { get; set; }
            public string? VorzeichenMenge { get; set; }
            public decimal? Menge { get; set; }
            public string? VorzeichenPreis { get; set; }
            public decimal? Preis { get; set; }
            public string? KagCode { get; set; }
        }

        public SiaRecordGGroup(List<SiaRecordG> list)
        {
            this.Records = list;

            this.Kapitelnummer = Records.First().Kapitelnummer;
            this.Leistungsposition = Records.First().Leistungsposition;

            if (!Records.TrueForAll(r => r.Kapitelnummer == Records.First().Kapitelnummer))
            {
                throw new Exception("Diese Records haben nicht die gleiche Kapitelnummer.");
            }

            if (!Records.TrueForAll(r => r.Leistungsposition == this.Leistungsposition))
            {
                throw new Exception("Diese Records haben nicht die gleiche Leistungsposition.");
            }

            if (Records.Any(r => r.Recordtyp == "1"))
            {
                var r = Records.Single(r => r.Recordtyp == "1");
                this.Überschrift = r.Positionstext + " " + r.SpezielleCodierungen;
            }

            if (Records.Any(r => r.Recordtyp == "2"))
                this.Überschrift = Records.Single(r => r.Recordtyp == "2").Positionstext;

            if (Records.Any(r => r.Recordtyp == "3"))
                this.Positionstext = Records.Where(r => r.Recordtyp == "3").Select(r => r.Positionstext).Aggregate((current, next) => current + "\n" + next);

            if (Records.Any(r => r.Recordtyp == "5"))
                this.Mengeneinheit = Records.Single(r => r.Recordtyp == "5").Mengeneinheit;

            if (Records.Any(r => r.Recordtyp == "6"))
            {
                this.Unterpositionen = Records
                    .Where(r => r.Recordtyp == "6")
                    .Select(r =>
                    {
                        return
                        new Unterposition() {
                            Objektgliederung = r.Objektgliederung,
                            Positionslage = r.Positionslage,
                            Mengenart = r.Mengenart,
                            VorzeichenMenge = r.VorzeichenMenge,
                            Menge = r.getMenge(),
                            VorzeichenPreis = r.VorzeichenPreis,
                            Preis = r.getPreis(),
                            KagCode = r.KagCode,
                        };
                    }).ToList();
                this.Preis = this.Unterpositionen.Sum(u => u.Preis);
                this.Menge = this.Unterpositionen.Sum(u => u.Menge);
            }
        }

        public override string ToString()
        {
            string ret = String.Format("kn: {0,-3}  {1,21}\n", Kapitelnummer, "lp: " + Leistungsposition);
            ret += (" " + Überschrift).PadLeft(30, '=') + "\n";

            //foreach (var up in Unterpositionen)
            //{
            //    ret += up.Variablennummer.PadLeft(30, '-') + "\n";
            //    ret += $"{up.Text}\n";
            //}

            //ret += "==============================\n";
            //ret += $"{Mengenart} {KagCode}       {VorzeichenMenge}{Menge} {Mengeneinheit}\n";

            return ret + "\n\n";
        }
    }
}
