using System;
using System.ComponentModel.DataAnnotations;

namespace AsbCloudApp.Data.SAUB;

/// <summary>
/// Сообщение получаемое по телеметрии и отправляемое в frontend
/// </summary>
public class TelemetryDataSaubDto : ITelemetryData
{
    /// <summary>
    /// метка времени данных
    /// </summary>
    [Required]
    public DateTime DateTime { get; set; }
    
    /// <summary>
    /// Пользователь САУБ
    /// </summary>
    public int? IdUser { get; set; }

    /// <summary>
    /// Режим работы САУБ:
    /// 0 - "РУЧНОЙ"
    /// 1 - "БУРЕНИЕ В РОТОРЕ"
    /// 2 - "ПРОРАБОТКА"
    /// 3 - "БУРЕНИЕ В СЛАЙДЕ"
    /// 4 - "СПУСК СПО"
    /// 5 - "ПОДЪЕМ СПО"
    /// 6 - "ПОДЪЕМ С ПРОРАБОТКОЙ"
    /// 10 - "БЛОКИРОВКА"
    /// </summary>
    [Required]
    public short Mode { get; set; }

    /// <summary>
    /// telemetry id
    /// </summary>
    public int IdTelemetry { get; set; }

    /// <summary>
    /// telemetry user
    /// </summary>
    public string? User { get; set; }

    /// <summary>
    /// Глубина забоя, м
    /// </summary>
    public float WellDepth { get; set; }

    /// <summary>
    /// Глубина долота, м
    /// </summary>
    public float BitDepth { get; set; }

    /// <summary>
    /// Талевый блок. Положение, м
    /// </summary>
    public float BlockPosition { get; set; }

    /// <summary>
    /// Талевый блок. Мин положение, м
    /// </summary>
    public float? BlockPositionMin { get; set; }

    /// <summary>
    /// Талевый блок. Макс положение, м
    /// </summary>
    public float? BlockPositionMax { get; set; }

    /// <summary>
    /// Талевый блок. Скорость, м/час
    /// </summary>
    public float? BlockSpeed { get; set; }

    /// <summary>
    /// Талевый блок. Задание скорости, м/час
    /// </summary>
    public float? BlockSpeedSp { get; set; }

    /// <summary>
    /// Талевый блок. Задание скорости для роторного бурения, м/час
    /// </summary>
    public float? BlockSpeedSpRotor { get; set; }

    /// <summary>
    /// Талевый блок. Задание скорости для режима слайда, м/час
    /// </summary>
    public float? BlockSpeedSpSlide { get; set; }

    /// <summary>
    /// Талевый блок. Задание скорости для проработки, м/час
    /// </summary>
    public float? BlockSpeedSpDevelop { get; set; }

    /// <summary>
    /// Давление, атм
    /// </summary>
    public float Pressure { get; set; }

    /// <summary>
    /// Давление при холостом ходе, атм
    /// </summary>
    public float? PressureIdle { get; set; }

    /// <summary>
    /// действующее задание давления, атм
    /// </summary>
    public float? PressureSp { get; set; }

    /// <summary>
    /// задание давления для роторного режима, атм
    /// </summary>
    public float? PressureSpRotor { get; set; }

    /// <summary>
    /// задание давления для режима слайда, атм
    /// </summary>
    public float? PressureSpSlide { get; set; }

    /// <summary>
    /// задание давления для проработки, атм
    /// </summary>
    public float? PressureSpDevelop { get; set; }

    /// <summary>
    /// ограничение макс перепада давления, атм
    /// </summary>
    public float? PressureDeltaLimitMax { get; set; }

    /// <summary>
    /// осевая нагрузка, т
    /// </summary>
    public float AxialLoad { get; set; }

    /// <summary>
    /// задание осевой нагрузки, т
    /// </summary>
    public float? AxialLoadSp { get; set; }

    /// <summary>
    /// ограничение макс. осевой нагрузки, т
    /// </summary>
    public float? AxialLoadLimitMax { get; set; }

    /// <summary>
    /// Вес на крюке, т
    /// </summary>
    public float HookWeight { get; set; }

    /// <summary>
    /// Вес на крюке на х.х., т
    /// </summary>
    public float? HookWeightIdle { get; set; }

    /// <summary>
    /// ограничение мин веса на крюке, т
    /// </summary>
    public float? HookWeightLimitMin { get; set; }

    /// <summary>
    /// ограничение макс веса на крюке, т
    /// </summary>
    public float? HookWeightLimitMax { get; set; }

    /// <summary>
    /// момент ротора, кН*м
    /// </summary>
    public float RotorTorque { get; set; }

    /// <summary>
    /// момент ротора на х.х., кН*м
    /// </summary>
    public float? RotorTorqueIdle { get; set; }

    /// <summary>
    /// задание момента ротора, кН*м
    /// </summary>
    public float? RotorTorqueSp { get; set; }

    /// <summary>
    /// ограничение момента ротора, кН*м
    /// </summary>
    public float? RotorTorqueLimitMax { get; set; }

    /// <summary>
    /// скорость ротора, об/мин
    /// </summary>
    public float RotorSpeed { get; set; }

    /// <summary>
    /// расход, л/с
    /// </summary>
    public float? Flow { get; set; }

    /// <summary>
    /// расход на х.х., л/с
    /// </summary>
    public float? FlowIdle { get; set; }

    /// <summary>
    /// ограничение макс расхода, л/с
    /// </summary>
    public float? FlowDeltaLimitMax { get; set; }

    /// <summary>
    /// id текущего критерия бурения
    /// </summary>
    public short? IdFeedRegulator { get; set; }

    /// <summary>
    /// Текущее состояние работы MSE
    /// </summary>
    public short? MseState { get; set; }

    /// <summary>
    /// MSE
    /// </summary>
    public float? Mse { get; set; }

    /// <summary>
    /// Расход. Буровой насос 1
    /// </summary>
    public float? Pump0Flow { get; set; }

    /// <summary>
    /// Расход. Буровой насос 2
    /// </summary>
    public float? Pump1Flow { get; set; }

    /// <summary>
    /// Расход. Буровой насос 3
    /// </summary>
    public float? Pump2Flow { get; set; }
}