using AsbCloudApp.Data.DailyReport;
using ClosedXML.Excel;

namespace AsbCloudInfrastructure.Services.DailyReport.DailyReportBlocks
{

    internal class DimensionlessBlock : BlockAbstract
    {
        private readonly NoDrillingDto blockDto;

        public SaubBlock SaubBlock { get; set; }

        public CellAddress AddressDimensionTitle { get; }
        public CellAddress AddressPreparationTitle { get; }
        public CellAddress AddressExtensionTitle { get; }
        public CellAddress AddressPreparationDescription { get; }
        public CellAddress AddressExtensionDescription { get; }
        public CellAddress[] AddressPreparationHead { get; }
        public CellAddress[] AddressPreparationValue { get; }
        public CellAddress[] AddressExtensionHead { get; }
        public CellAddress[] AddressExtensionValue { get; }
        public CellAddress AddressBlockFormula { get; }
        public override CellAddress AddressBlockBegin { get; }
        public override CellAddress AddressBlockEnd { get; }
        public DimensionlessBlock(CellAddress addressBlockBegin, NoDrillingDto blockDto)
        {
            AddressBlockBegin = addressBlockBegin.Copy();
            this.blockDto = blockDto;
            
            AddressDimensionTitle = addressBlockBegin + (2, 3);
            AddressPreparationTitle = addressBlockBegin + (3, 1);
            AddressExtensionTitle = addressBlockBegin + (3, 4);            
            AddressPreparationHead = new CellAddress[4];
            AddressPreparationHead[0] = addressBlockBegin + (4, 1);
            AddressPreparationHead[1] = addressBlockBegin + (5, 1);
            AddressPreparationHead[2] = addressBlockBegin + (6, 1);
            AddressPreparationHead[3] = addressBlockBegin + (7, 1);
            AddressPreparationValue = new CellAddress[4];
            AddressPreparationValue[0] = addressBlockBegin + (4, 3);
            AddressPreparationValue[1] = addressBlockBegin + (5, 3);
            AddressPreparationValue[2] = addressBlockBegin + (6, 3);
            AddressPreparationValue[3] = addressBlockBegin + (7, 3);
            AddressPreparationDescription = addressBlockBegin + (8, 1);
            AddressExtensionHead = new CellAddress[4];
            AddressExtensionHead[0] = addressBlockBegin + (4, 4);
            AddressExtensionHead[1] = addressBlockBegin + (5, 4);
            AddressExtensionHead[2] = addressBlockBegin + (6, 4);
            AddressExtensionHead[3] = addressBlockBegin + (7, 4);
            AddressExtensionValue = new CellAddress[4];
            AddressExtensionValue[0] = addressBlockBegin + (4, 6);
            AddressExtensionValue[1] = addressBlockBegin + (5, 6);
            AddressExtensionValue[2] = addressBlockBegin + (6, 6);
            AddressExtensionValue[3] = addressBlockBegin + (7, 6);
            AddressExtensionDescription = addressBlockBegin + (8, 4);
            AddressBlockEnd = addressBlockBegin + (9,0);
        }

        private string FormulaBlockPlan(CellAddress cellTarget)
        {
            return $"={cellTarget}/60*{SaubBlock.AddressExtensionsCountValue}";
        }

        private string FormulaBlockExcess(CellAddress cellFact, CellAddress cellPlan)
        {
            return string.Format("={0}-{1}", cellFact.ToString(), cellPlan.ToString());
        }

        public override void Draw(IXLWorksheet sheet)
        {
            sheet.Range(AddressDimensionTitle.RowNumber, AddressDimensionTitle.ColumnNumber,
                AddressDimensionTitle.RowNumber, AddressDimensionTitle.ColumnNumber + 1)
                .Merge()                
                .Style.Alignment.SetWrapText(true);
            sheet.Cell(AddressDimensionTitle.RowNumber, AddressDimensionTitle.ColumnNumber)._ValueNoBorder("БЕЗМЕТРАЖНЫЕ РАБОТЫ",true);
            sheet._Range(AddressPreparationTitle, AddressPreparationTitle + (0, 2))
                ._SetValue("Подготовка ствола скв. к наращиванию");
            sheet._Range(AddressExtensionTitle, AddressExtensionTitle + (0, 2))
                ._SetValue("Наращивание");
            sheet._Range(AddressPreparationHead[0], AddressPreparationHead[0] + (0, 1))
                ._SetValue("Норматив на одну операцию, (мин):");
            sheet.Cell(AddressPreparationValue[0])
               ._SetValue($"{blockDto.StandardTimeBarrelPreparation}");
            sheet._Range(AddressPreparationHead[1], AddressPreparationHead[1] + (0, 1))
                ._SetValue("Проработка при бур, план (ч):");
            sheet.Cell(AddressPreparationValue[1])
               .SetFormulaA1($"{FormulaBlockPlan(AddressPreparationValue[0])}").Style.SetAllBorders();
            sheet._Range(AddressPreparationHead[2], AddressPreparationHead[2] + (0, 1))
                ._SetValue("Проработка при бур, факт (ч):");
            sheet.Cell(AddressPreparationValue[2])
               ._SetValue($"{blockDto.StandardTimeExtension}");
            sheet._Range(AddressPreparationHead[3], AddressPreparationHead[3] + (0, 1))
                ._SetValue("Превышение плановых норм, (ч):");
            sheet.Cell(AddressPreparationValue[3])
               .SetFormulaA1($"{FormulaBlockExcess(AddressPreparationValue[2], AddressPreparationValue[1])}").Style.SetAllBorders();
            sheet._Range(AddressExtensionHead[0], AddressExtensionHead[0] + (0, 1))
                ._SetValue("Норматив на одну операцию, (мин):");
            sheet.Cell(AddressExtensionValue[0])
               ._SetValue($"{blockDto.StandardTimeExtension}");
            sheet._Range(AddressExtensionHead[1], AddressExtensionHead[1] + (0, 1))
                ._SetValue("Наращивание, план (ч):");
            sheet.Cell(AddressExtensionValue[1])
               .SetFormulaA1($"{FormulaBlockPlan(AddressExtensionValue[0])}").Style.SetAllBorders();
            sheet._Range(AddressExtensionHead[2], AddressExtensionHead[2] + (0, 1))
                ._SetValue("Наращивание, факт (ч):");
            sheet.Cell(AddressExtensionValue[2])
               ._SetValue($"{blockDto.ActualTimeExtension}");
            sheet._Range(AddressExtensionHead[3], AddressExtensionHead[3] + (0, 1))
                ._SetValue("Превышение плановых норм, (ч):");
            sheet.Cell(AddressExtensionValue[3])
               .SetFormulaA1($"{FormulaBlockExcess(AddressExtensionValue[2], AddressExtensionValue[1])}").Style.SetAllBorders();
            sheet._Range(AddressPreparationDescription, AddressPreparationDescription + (1, 2))
                ._SetValue("Подготовка ствола скв. к наращиванию");
            sheet._Range(AddressExtensionDescription, AddressExtensionDescription + (1, 2))
                ._SetValue("Наращивание");
        }
    }

}