using Gremlin.GremlinData.EntityClasses;
using Gremlin.GremlinUtilities;
using Gremlin.MVVM.ViewModels;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows;

namespace Gremlin.MVVM.Models
{
	public class LineItemModel
	{
		public static IList<LineItem> ConvertToLineItems(ObservableCollection<LineItemViewModel> lineItemsVM)
		{
			IList<LineItem> lineItems = new List<LineItem>();

			foreach (LineItemViewModel lineItemViewModel in lineItemsVM)
			{
				LineItem lineItem = ConvertToLineItem(lineItemViewModel);
				lineItems.Add(lineItem);
			}

			return lineItems;
		}

		public static LineItem ConvertToLineItem(LineItemViewModel lineItemViewModel)
		{
			LineItem lineItem = new()
			{
				ProductNumber = lineItemViewModel.ProductNumber,
				OptionNumber = lineItemViewModel.OptionNumber,
				ProductLine = lineItemViewModel.ProductLine,
				ListPrice = lineItemViewModel.ListPrice,
				SapShortDescription = lineItemViewModel.SapShortDescription,
				TotalDiscount = lineItemViewModel.TotalDiscount,
				Total = lineItemViewModel.CalcTotalNet,
				DataModificationByUser = "Gremlin",
				DataStatus = "Active"
			};

			return lineItem;
		}

		public static ObservableCollection<LineItemViewModel> ReadLineItemsFromClipboard(QuoteViewModel quoteVM)
		{
			if (Clipboard.GetText() != "")
			{
				string clipboard = Clipboard.GetText();

				//Angebot in eine TSV-File schreiben
				FileIO.WriteClipboardToTSV(clipboard, quoteVM);

				//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<LineItemViewModel> ParseClipboardList(IEnumerable<string[]> lineItemStrings)
		{
			ObservableCollection<LineItemViewModel> 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
					LineItemViewModel lineItem = new()
					{
						Position = ushort.Parse(lineItemString[0]),
						ProductNumber = lineItemString[1],
						OptionNumber = lineItemString[2],
						ProductLine = lineItemString[3],
						SapShortDescription = lineItemString[4],
						Amount = ushort.Parse(lineItemString[5]),
						ListPrice = decimal.Parse(lineItemString[6]),
						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.CustomDescriptionVM = CustomDescriptionViewModel.GetCustomDescription(lineItem);

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

	}
}
