using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows;

namespace Gremlin.GremlinUI.ViewModels
{
    internal class LineItemVM : BaseVM
    {
        public ushort Position { get; private set; }
        public ushort Amount { get; internal set; }
        public string ProductNumber { get; private set; }
        public string OptionNumber { get; private set; }
        public string SapShortDescription { get; private set; }
        public CustomDescriptionVM CustomDescription { get; private set; }
        public string ProductLine { get; private set; }
        public decimal TotalDiscount { get; internal set; }

        {
                string clipboard = Clipboard.GetText();

                //Zeilen aufteilen
                IEnumerable<string> clipboardLines = clipboard.Split(Environment.NewLine.ToCharArray());
                List<string[]> clipboardList = new();

                foreach (string clipboardLine in clipboardLines)
                {
                    if (clipboardLine != "")
                    {
                        //Nach Trennzeichen trennen
                        string[] clipboardLineSplit = clipboardLine.Split('\t');
                        clipboardList.Add(clipboardLineSplit);
                    }
                }

                return ParseClipboardList(clipboardList);
            }
            else
            {
                _ = MessageBox.Show("Clipboard ist leer!");
                return null;
            }
        }

        public static ObservableCollection<LineItemVM> ParseClipboardList(IEnumerable<string[]> lineItemStrings)
        {
            ObservableCollection<LineItemVM> lineItems = new();
            int countError = 0;
            int countEmpty = 0;

            foreach (string[] lineItemString in lineItemStrings)
            {
                //Anzahl an Spalten entspricht Clipboard
                if (lineItemString.Length == 19)
                {
                    //Header ignorieren
                    if (lineItemString[0] == "#")
                    {
                        countEmpty++;
                        continue;
                    }

                    //Dateiinhalt in Klasse schreiben
                    LineItemVM lineItem = new();
                    lineItem.Position = ushort.Parse(lineItemString[0]);
                    lineItem.ProductNumber = lineItemString[1];
                    lineItem.OptionNumber = lineItemString[2];
                    lineItem.ProductLine = lineItemString[3];
                    lineItem.SapShortDescription = lineItemString[4];
                    lineItem.Amount = ushort.Parse(lineItemString[5]);
                    lineItem.ListPrice = decimal.Parse(lineItemString[6]);
                    lineItem.TotalDiscount = decimal.Parse(lineItemString[9]);

                    //Preise einlesen
                    //lineItem.NetPrice = decimal.Parse(lineItemString[10]);
                    //lineItem.TotalNet = decimal.Parse(lineItemString[11]);

                    //Preise selbst berechnen
                    lineItem.CalcNetPrice = lineItem.ListPrice * (100 - lineItem.TotalDiscount) / 100;
                    lineItem.CalcTotalNet = lineItem.CalcNetPrice * lineItem.Amount;

                    //nicht genutzte Felder
                    //lineItem.SalesDiscount = decimal.Parse(lineItemString[12]);
                    //lineItem.ContractualDiscount = decimal.Parse(lineItemString[13]);
                    //lineItem.PromotionalDiscount = decimal.Parse(lineItemString[14]);
                    //lineItem.DemoDiscount = decimal.Parse(lineItemString[15]);

                    lineItem.CustomDescription = CustomDescriptionVM.GetCustomDescription(lineItem);

                    lineItems.Add(lineItem);
                }
                else
                {
                    _ = MessageBox.Show("Angebot konnte nicht eingelesen werden!");
                    countError++;
                    continue;
                }
            }
            return lineItems;
        }

        internal static decimal GetTotalNet(ObservableCollection<LineItemVM> lineItems)
        {
            decimal totalNet = 0;
            foreach (LineItemVM lineItem in lineItems)
            {
                totalNet += lineItem.CalcNetPrice;
            }
            return totalNet;
        }

        internal static decimal GetTotalDiscount(ObservableCollection<LineItemVM> lineItems)
        {
            decimal totalDiscount = 0;
            foreach (LineItemVM lineItem in lineItems)
            {
                totalDiscount += lineItem.TotalDiscount;
            }
            return totalDiscount;
        }

        internal static decimal GetTotalListprice(ObservableCollection<LineItemVM> lineItems)
        {
            decimal totalListprice = 0;
            foreach (LineItemVM lineItem in lineItems)
            {
                totalListprice += lineItem.ListPrice;
            }
            return totalListprice;
        }
    }
}
