using AsbCloudApp.Data.SAUB;
using System;
using System.Collections.Generic;
using System.Linq;

namespace AsbCloudApp.Data;

/// <summary>
/// Инфо о скважине для отображения на карте последними данными телеметрии
/// </summary>
public class WellMapInfoWithTelemetryStat : WellMapInfoDto
{
    /// <summary>
    /// Последние полученные данные от АПД
    /// </summary>
    public TelemetryDataSaubDto? LastDataSaub { get; set; }

    /// <summary>
    /// Последние полученные данные от Осцилляции
    /// </summary>
    public TelemetryDataSpinDto? LastDataSpin { get; set; }

    /// <summary>
    /// Дата полседнего получения данных от ННБ
    /// </summary>
    public DateTime? LastDataDdsDate { get; set; }

    /// <summary>
    /// Дата полседнего получения данных от ГТИ
    /// </summary>
    public DateTime? LastDataGtrDate { get; set; }

    /// <summary>
    /// Дата полседнего получения данных от СКПБ
    /// </summary>
    public DateTime? LastDataDpcsDate { get; set; }

    /// <summary>
    /// Дата полседнего получения данных от станции контроля параметров цементирования (СКЦ)
    /// </summary>
    public DateTime? LastDataCpmsDate { get; set; }

    /// <summary>
    /// Компании
    /// </summary>
    public IEnumerable<CompanyDto> Companies { get; set; } = Enumerable.Empty<CompanyDto>();
}

/// <summary>
/// Инфо о скважине для отображения на карте
/// </summary>
public class WellMapInfoDto: MapPointBaseDto
{
    /// <summary>
    /// 0 - неизвестно,
    /// 1 - в работе,
    /// 2 - завершена
    /// </summary>
    public int IdState { get; set; }
    
    /// <summary>
    /// Название текущей секции
    /// </summary>
    public string? Section { get; set; }

    /// <summary>
    /// Коэф-т использования автоподачи долота (суммарный ротор + слайд)
    /// </summary>
    public double SaubUsage { get; set; }

    /// <summary>
    /// Коэф-т использования осциллятора
    /// </summary>
    public double SpinUsage { get; set; }

    /// <summary>
    /// Коэф-т использования демпфера
    /// </summary>
    public double TorqueKUsage { get; set; }

    /// <summary>
    /// <para>Дата начала первой фактической операции</para>
    /// <para>Используется как дата начала бурения</para>
    /// </summary>
    public DateTimeOffset? FirstFactOperationDateStart { get; set; }

    /// <summary>
    /// <para>Дата окончания последней прогнозируемой операции</para>
    /// <para>Если скважина завершена, то дата окончания последней фактической операции</para>
    /// <para>Используется как прогноз окончания бурения</para>
    /// </summary>
    public DateTimeOffset? LastPredictOperationDateEnd { get; set; }

    /// <summary>
    /// Рейсовая скорость проходки, последнего рейса
    /// </summary>
    public PlanFactDto<double?> RaceSpeed { get; set; } = null!;

    /// <summary>
    /// Механическая скорость проходки, последней операции бурения
    /// </summary>
    public PlanFactDto<double?> ROP { get; set; } = null!;

    /// <summary>
    /// Нагрузка на долота, Т 
    /// </summary>
    public PlanFactDto<double?> AxialLoad { get; set; } = null!;

    /// <summary>
    /// Обороты ротора
    /// </summary>
    public PlanFactDto<double?> TopDriveSpeed { get; set; } = null!;

    /// <summary>
    /// Момент ротора кн/м
    /// </summary>
    public PlanFactDto<double?> TopDriveTorque { get; set; } = null!;

    /// <summary>
    /// Перепад давления
    /// </summary>
    public PlanFactDto<double?> Pressure { get; set; } = null!;
    
    /// <summary>
    /// Действующее задание давления, атм
    /// </summary>
    public double? PressureSp { get; set; }

    /// <summary>
    /// Плановая и текущая глубина
    /// </summary>
    public PlanFactDto<double?> WellDepth { get; set; } = null!;

    /// <summary>
    /// Отставание от ГГД, дни
    /// </summary>
    public double? TvdLagDays { get; set; }
    
    /// <summary>
    /// Кол-во дней бурения по ГГД
    /// </summary>
    public double? TvdDrillingDays { get; set; }
}