using Microsoft.EntityFrameworkCore;
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization;

namespace AsbCloudDb.Model
{
    [Table("t_data_saub_stat"), Comment("Кеш-таблица для хранения данных для РТК-отчета")]
    public class DataSaubStat : IId, IDataSaubStat
    {
        [Key]
        [Column("id")]
        public int Id { get; set; }

        [Column("date_start", TypeName = "timestamp with time zone"), Comment("Дата и время начала")]
        public DateTimeOffset DateStart { get; set; }

        [Column("date_end", TypeName = "timestamp with time zone"), Comment("Дата и время окончания")]
        public DateTimeOffset DateEnd { get; set; }

        [Column("depth_start"), Comment("Глубина забоя по стволу начальная")]
        public double DepthStart { get; set; }

        [Column("depth_end"), Comment("Глубина забоя по стволу конечная")]
        public double DepthEnd { get; set; }

        [Column("speed"), Comment("Скорость бурения")]
        public double Speed { get; set; }

        [Column("block_speed_sp"), Comment("Ограничение скорости блока")]
        public double? BlockSpeedSp { get; set; }

        [Column("pressure"), Comment("Давление")]
        public double Pressure { get; set; }

        [Column("pressure_idle"), Comment("Давление холостого хода")]
        public double? PressureIdle { get; set; }

        [Column("pressure_sp"), Comment("Ограничение фактического давления")]
        public double? PressureSp { get; set; }

        [Column("axial_load"), Comment("Фактическая нагрузка")]
        public double AxialLoad { get; set; }

        [Column("axial_load_sp"), Comment("Ограничение факт. нагрузки")]
        public double? AxialLoadSp { get; set; }

        [Column("axial_load_limit_max"), Comment("Максимально допустимая нагрузка")]
        public double? AxialLoadLimitMax { get; set; }

        [Column("rotor_torque"), Comment("Фактический момент")]
        public double RotorTorque { get; set; }

        [Column("rotor_torque_sp"), Comment("Ограничение факт. момента")]
        public double? RotorTorqueSp { get; set; }

        [Column("rotor_torque_limit_max"), Comment("Максимально допустимый момент")]
        public double? RotorTorqueLimitMax { get; set; }

        [Column("id_feed_regulator"), Comment("Работа при достижении ограничения")]
        public short? IdFeedRegulator { get; set; }

        [Column("rotor_speed"), Comment("Фактическая скорость оборотов ВСП")]
        public double RotorSpeed { get; set; }

        [Column("id_category"), Comment("Название автоопределённой операции")]
        public int IdCategory { get; set; }

        [Column("enabled_subsystems"), Comment("Флаги подсистем")]
        public int EnabledSubsystems { get; set; }

        [Column("has_oscillation"), Comment("Наличие или отсутствие осцилляции")]
        public bool HasOscillation { get; set; }

        [Column("flow"), Comment("Фактический расход")]
        public double Flow { get; set; }

        [Column("id_telemetry"), Comment("Ключ телеметрии")]
        public int IdTelemetry { get; set; }

        [ForeignKey(nameof(IdTelemetry))]
        public virtual Telemetry Telemetry { get; set; } = null!;

        [JsonIgnore]
        [ForeignKey(nameof(IdCategory))]
        public virtual WellOperationCategory OperationCategory { get; set; } = null!;
    }
}