using ComputerShopBusinessLogic.OfficePackage.HelperEnums;
using ComputerShopBusinessLogic.OfficePackage.HelperModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ComputerShopBusinessLogic.OfficePackage
{
    public abstract class AbstractSaveToExcelImplementer
    {
        public void CreateReport(ExcelInfoImplementer info)
        {
            CreateExcel(info);

            InsertCellInWorksheet(new ExcelCellParameters
            {
                ColumnName = "A",
                RowIndex = 1,
                Text = info.Title1,
                StyleInfo = ExcelStyleInfoType.Title
            });

			InsertCellInWorksheet(new ExcelCellParameters
			{
				ColumnName = "B",
				RowIndex = 1,
				Text = info.Title2,
				StyleInfo = ExcelStyleInfoType.Title
			});

			InsertCellInWorksheet(new ExcelCellParameters
			{
				ColumnName = "C",
				RowIndex = 1,
				Text = info.Title3,
				StyleInfo = ExcelStyleInfoType.Title
			});

			InsertCellInWorksheet(new ExcelCellParameters
			{
				ColumnName = "D",
				RowIndex = 1,
				Text = info.Title4,
				StyleInfo = ExcelStyleInfoType.Title
			});

			InsertCellInWorksheet(new ExcelCellParameters
			{
				ColumnName = "E",
				RowIndex = 1,
				Text = info.Title5,
				StyleInfo = ExcelStyleInfoType.Title
			});

			InsertCellInWorksheet(new ExcelCellParameters
			{
				ColumnName = "F",
				RowIndex = 1,
				Text = info.Title6,
				StyleInfo = ExcelStyleInfoType.Title
			});

			InsertCellInWorksheet(new ExcelCellParameters
			{
				ColumnName = "G",
				RowIndex = 1,
				Text = info.Title7,
				StyleInfo = ExcelStyleInfoType.Title
			});

			uint rowIndex = 2;
            foreach (var orderAs in info.OrderAssemblies)
            {
                int cnt_of_assemblies = orderAs.Assemblies.Count;
                int assemblyIndex = 0;
                foreach (var assembly in orderAs.Assemblies)
                {
                    if (!string.IsNullOrEmpty(assembly.AssemblyName) && !string.IsNullOrEmpty(assembly.AssemblyCategory) && assembly.AssemblyPrice != 0)
					{
                        InsertCellInWorksheet(new ExcelCellParameters
                        {
                            ColumnName = "A",
                            RowIndex = rowIndex,
                            Text = orderAs.OrderId.ToString(),
                            StyleInfo = ExcelStyleInfoType.Text
                        });
                        InsertCellInWorksheet(new ExcelCellParameters
                        {
                            ColumnName = "B",
                            RowIndex = rowIndex,
                            Text = orderAs.DateCreateOrder.ToShortDateString(),
                            StyleInfo = ExcelStyleInfoType.Text
                        });
                        InsertCellInWorksheet(new ExcelCellParameters
                        {
                            ColumnName = "C",
                            RowIndex = rowIndex,
                            Text = orderAs.OrderSum.ToString(),
                            StyleInfo = ExcelStyleInfoType.Text
                        });
                        InsertCellInWorksheet(new ExcelCellParameters
                        {
                            ColumnName = "D",
                            RowIndex = rowIndex,
                            Text = orderAs.OrderStatus.ToString(),
                            StyleInfo = ExcelStyleInfoType.Text
                        });
                        InsertCellInWorksheet(new ExcelCellParameters
                        {
                            ColumnName = "E",
                            RowIndex = rowIndex,
                            Text = assembly.AssemblyName,
                            StyleInfo = ExcelStyleInfoType.Text
                        });
                        InsertCellInWorksheet(new ExcelCellParameters
                        {
                            ColumnName = "F",
                            RowIndex = rowIndex,
                            Text = assembly.AssemblyCategory,
                            StyleInfo = ExcelStyleInfoType.Text
                        });
                        InsertCellInWorksheet(new ExcelCellParameters
                        {
                            ColumnName = "G",
                            RowIndex = rowIndex,
                            Text = assembly.AssemblyPrice.ToString(),
                            StyleInfo = ExcelStyleInfoType.Text
                        });
                    }
					assemblyIndex++;
					if (assemblyIndex < cnt_of_assemblies && !string.IsNullOrEmpty(assembly.AssemblyName) && !string.IsNullOrEmpty(assembly.AssemblyCategory) && assembly.AssemblyPrice != 0)
					{
                        rowIndex++;
                    }
                }
                //rowIndex++;
            }
            SaveExcel(info);
        }
        protected abstract void CreateExcel(ExcelInfoImplementer info);
        protected abstract void InsertCellInWorksheet(ExcelCellParameters excelParams);
        protected abstract void MergeCells(ExcelMergeParameters excelParams);
        protected abstract void SaveExcel(ExcelInfoImplementer info);
    }
}