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

namespace AsbCloudInfrastructure.Services.DailyReport.DailyReportBlocks
{

    class HeadBlock : BlockAbstract
    {
        private readonly HeadDto blockDto;

        public CellAddress AddressTitle { get; }
        public CellAddress AddressCustomer { get; }
        public CellAddress AddressDriller { get; }
        public CellAddress AddressPeriod { get; }
        public CellAddress AddressSlaughter { get; }
        public CellAddress AddressTrajectoryTableTitle { get; }
        public CellAddress AddressDrillerOneTitle { get; }
        public CellAddress AddressDrillerOne { get; }
        public CellAddress AddressDrillerTwoTitle { get; }
        public CellAddress AddressDrillerTwo { get; }
        public CellAddress AddressWorkSaubTitle { get; }
        public CellAddress AddressWatchTitle { get; }
        public CellAddress AddressMetreTitle { get; }
        public CellAddress[] AddressWorkSaubData { get; }
        public CellAddress[] AddressWatchData { get; }
        public CellAddress[] AddressMetreData { get; }
        public CellAddress[] AddressPeriodTableHeadArray { get; }
        public CellAddress[] AddressPeriodTableDataArray { get; }
        public CellAddress[] AddressTrajectoryTableHeadArray { get; }
        public CellAddress[] AddressTrajectoryTableDataArray { get; }
        public override CellAddress AddressBlockBegin { get; }
        public override CellAddress AddressBlockEnd { get; }        
        public HeadBlock(CellAddress addressBlockBegin, HeadDto blockDto)
        {
            AddressBlockBegin = addressBlockBegin.Copy();
            this.blockDto = blockDto;
            AddressTitle = addressBlockBegin + (0, 0);
            AddressCustomer = addressBlockBegin + (1, 0);
            AddressDriller = addressBlockBegin + (2, 0);
            AddressPeriod = addressBlockBegin + (4, 0);
            AddressSlaughter = addressBlockBegin + (4, 4);
            AddressPeriodTableHeadArray = new CellAddress[4];
            AddressPeriodTableHeadArray[0]= addressBlockBegin + (5, 0);
            AddressPeriodTableHeadArray[1] = addressBlockBegin + (5, 2);
            AddressPeriodTableHeadArray[2] = addressBlockBegin + (5, 4);
            AddressPeriodTableHeadArray[3] = addressBlockBegin + (5, 6);
            AddressPeriodTableDataArray = new CellAddress[4];
            AddressPeriodTableDataArray[0] = addressBlockBegin + (6, 0);
            AddressPeriodTableDataArray[1] = addressBlockBegin + (6, 2);
            AddressPeriodTableDataArray[2] = addressBlockBegin + (6, 4);
            AddressPeriodTableDataArray[3] = addressBlockBegin + (6, 6);
            AddressTrajectoryTableTitle = addressBlockBegin + (8,0);
            AddressTrajectoryTableHeadArray = new CellAddress[4];
            AddressTrajectoryTableHeadArray[0] = addressBlockBegin + (9, 0);
            AddressTrajectoryTableHeadArray[1] = addressBlockBegin + (9, 2);
            AddressTrajectoryTableHeadArray[2] = addressBlockBegin + (9, 4);
            AddressTrajectoryTableHeadArray[3] = addressBlockBegin + (9, 6);
            AddressTrajectoryTableDataArray = new CellAddress[4];
            AddressTrajectoryTableDataArray[0] = addressBlockBegin + (10, 0);
            AddressTrajectoryTableDataArray[1] = addressBlockBegin + (10, 2);
            AddressTrajectoryTableDataArray[2] = addressBlockBegin + (10, 4);
            AddressTrajectoryTableDataArray[3] = addressBlockBegin + (10, 6);
            AddressDrillerOneTitle = addressBlockBegin + (12, 0);
            AddressDrillerOne = addressBlockBegin + (12, 2);
            AddressDrillerTwoTitle = addressBlockBegin + (13, 0);
            AddressDrillerTwo = addressBlockBegin + (13, 2);
            AddressWorkSaubTitle = addressBlockBegin + (15, 0);
            AddressWatchTitle = addressBlockBegin + (15, 3);
            AddressMetreTitle = addressBlockBegin + (15, 4);
            AddressWorkSaubData = new CellAddress[4];
            AddressWorkSaubData[0] = addressBlockBegin + (16, 0);
            AddressWorkSaubData[1] = addressBlockBegin + (17, 0);
            AddressWorkSaubData[2] = addressBlockBegin + (18, 0);
            AddressWorkSaubData[3] = addressBlockBegin + (19, 0);
            AddressWatchData = new CellAddress[4];
            AddressWatchData[0] = addressBlockBegin + (16, 3);
            AddressWatchData[1] = addressBlockBegin + (17, 3);
            AddressWatchData[2] = addressBlockBegin + (18, 3);
            AddressWatchData[3] = addressBlockBegin + (19, 3);
            AddressMetreData = new CellAddress[4];
            AddressMetreData[0] = addressBlockBegin + (16, 4);
            AddressMetreData[1] = addressBlockBegin + (17, 4);
            AddressMetreData[2] = addressBlockBegin + (18, 4);
            AddressBlockEnd = AddressWatchData[3]+(0,1);
        }

        public override void Draw(IXLWorksheet sheet)
        {
            sheet._Range(AddressTitle, AddressTitle + (0, 7))
                ._SetValue($"Суточная сводка бурения скважины: {blockDto.WellName}, куст: {blockDto.ClusterName}")

                .Style.SetH1();
                
            sheet._Range(AddressCustomer, AddressCustomer + (0, 7))
                ._SetValue($"Заказчик: {blockDto.Customer}")
                .Style.SetH1();
            sheet._Range(AddressDriller, AddressDriller + (0, 7))
                ._SetValue($"Подрядчик: {blockDto.Contractor}")
                .Style.SetH1();
            sheet._Range(AddressPeriod, AddressPeriod + (0, 3))
                ._SetValue("Отчетный период");
            sheet._Range(AddressSlaughter, AddressSlaughter + (0, 3))
                ._SetValue("Забой за отчетный период, м");
            sheet._Range(AddressPeriodTableHeadArray[0], AddressPeriodTableHeadArray[0] + (0, 1))
                ._SetValue("От (дата, время)");
            sheet._Range(AddressPeriodTableHeadArray[1], AddressPeriodTableHeadArray[1] + (0, 1))
                ._SetValue("До (дата, время)");
            sheet._Range(AddressPeriodTableHeadArray[2], AddressPeriodTableHeadArray[2] + (0, 1))
                ._SetValue("От");
            sheet._Range(AddressPeriodTableHeadArray[3], AddressPeriodTableHeadArray[3] + (0, 1))
                ._SetValue("До");
            sheet._Range(AddressPeriodTableDataArray[0], AddressPeriodTableDataArray[0] + (0, 1))
                ._SetValue($"{blockDto.ReportDate}");            
            sheet._Range(AddressPeriodTableDataArray[1], AddressPeriodTableDataArray[1] + (0, 1))._SetValue("");
            sheet.Cell(AddressPeriodTableDataArray[1])
                .SetFormulaA1(string.Format("{0}-1", AddressPeriodTableDataArray[0].ToString()))
                .Style.DateFormat.Format= "DD.MM.YYYY HH:MM:SS";
            sheet._Range(AddressPeriodTableDataArray[2], AddressPeriodTableDataArray[2] + (0, 1))
                ._SetValue($"{blockDto.WellDepthIntervalStartDate}");
            sheet._Range(AddressPeriodTableDataArray[3], AddressPeriodTableDataArray[3] + (0, 1))
                ._SetValue($"{blockDto.WellDepthIntervalFinishDate}");
            sheet._Range(AddressTrajectoryTableTitle, AddressTrajectoryTableTitle + (0, 7))
                ._SetValue("Данные по траектории скважины на конец суток");
            sheet._Range(AddressTrajectoryTableHeadArray[0], AddressTrajectoryTableHeadArray[0] + (0, 1))
                ._SetValue("Глубина по стволу");
            sheet._Range(AddressTrajectoryTableHeadArray[1], AddressTrajectoryTableHeadArray[1] + (0, 1))
                ._SetValue("Глубина по вертикали");
            sheet._Range(AddressTrajectoryTableHeadArray[2], AddressTrajectoryTableHeadArray[2] + (0, 1))
                ._SetValue("Зенитный угол");
            sheet._Range(AddressTrajectoryTableHeadArray[3], AddressTrajectoryTableHeadArray[3] + (0, 1))
                ._SetValue("Азимут");
            sheet._Range(AddressTrajectoryTableDataArray[0], AddressTrajectoryTableDataArray[0] + (0, 1))
                ._SetValue($"{blockDto.BottomholeDepth}");
            sheet._Range(AddressTrajectoryTableDataArray[1], AddressTrajectoryTableDataArray[1] + (0, 1))
                ._SetValue($"{blockDto.VerticalDepth}");
            sheet._Range(AddressTrajectoryTableDataArray[2], AddressTrajectoryTableDataArray[2] + (0, 1))
                ._SetValue($"{blockDto.ZenithAngle}");
            sheet._Range(AddressTrajectoryTableDataArray[3], AddressTrajectoryTableDataArray[3] + (0, 1))
                ._SetValue($"{blockDto.AzimuthAngle}");
            sheet._Range(AddressDrillerOneTitle, AddressDrillerOneTitle + (0, 1))
                ._SetValue("Бурильщик  1 смена");
            sheet._Range(AddressDrillerOne, AddressDrillerOne + (0, 1))
                ._SetValue($"{blockDto.FirstDriller}");
            sheet._Range(AddressDrillerTwoTitle, AddressDrillerTwoTitle + (0, 1))
                ._SetValue("Бурильщик  2 смена");
            sheet._Range(AddressDrillerTwo, AddressDrillerTwo + (0, 1))
                ._SetValue($"{blockDto.SecondDriller}");
            sheet._Range(AddressWorkSaubTitle, AddressWorkSaubTitle + (0, 2))
                ._SetValue("Работа модулей САУБ:");
            sheet.Cell(AddressWatchTitle)
                ._SetValue("Часов:");
            sheet.Cell(AddressMetreTitle)
                ._SetValue("Метров:");
            sheet._Range(AddressWorkSaubData[0], AddressWorkSaubData[0] + (0, 2))
                ._SetValue("АПД (автоматическая подача долота), ч/м:");
            sheet.Cell(AddressWatchData[0])
                ._SetValue($"{blockDto.WorkTimeSAUB}");
            sheet.Cell(AddressMetreData[0])
                ._SetValue($"{blockDto.PenetrationSAUB}");
            sheet._Range(AddressWorkSaubData[1], AddressWorkSaubData[1] + (0, 2))
                ._SetValue("Спин Мастер (осцилляция),ч/м:");
            sheet.Cell(AddressWatchData[1])
                ._SetValue($"{blockDto.WorkTimeSpinMaster}");
            sheet.Cell(AddressMetreData[1])
                ._SetValue($"{blockDto.PenetrationSpinMaster}");
            sheet._Range(AddressWorkSaubData[2], AddressWorkSaubData[2] + (0, 2))
                ._SetValue("Торк Мастер (демпфирование), ч/:");
            sheet.Cell(AddressWatchData[2])
                ._SetValue($"{blockDto.WorkTimeTorkMaster}");
            sheet.Cell(AddressMetreData[2])
                ._SetValue($"{blockDto.PenetrationTorkMaster}");
            sheet._Range(AddressWorkSaubData[3], AddressWorkSaubData[3] + (0, 2))
                ._SetValue("МСЕ, колличество запусков, раз:");
            sheet._Range(AddressWatchData[3], AddressWatchData[3] + (0, 1))
                ._SetValue($"{blockDto.CountLaunchesMSE}");
        }
    }
}