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

namespace AsbCloudDb.Model
{
    [Table("t_well_operation_category"), Comment("Справочник операций на скважине")]
    public class WellOperationCategory : IId
    {
        #region constants category operations ids
        /// <summary>
        /// БУРЕНИЕ
        /// </summary>
        public const int IdDrilling = 3000;
        /// <summary>
        /// Непроизводительное время (НПВ)
        /// </summary>
        public const int IdNonProductiveTime = 3005;


        /// <summary>
        /// Механическое. бурение
        /// </summary>
        public const int IdMechanicalDrilling = 4001;

        /// <summary>
        /// Разборка КНБК
        /// </summary>
        public const int IdBhaDisassembly = 5000;
        /// <summary>
        /// Сборка КНБК
        /// </summary>
        public const int IdBhaAssembly = 5001;
        /// <summary>
        /// Направленно (СЛАЙД)
        /// </summary>
        public const int IdSlide = 5002;
        /// <summary>
        /// Ротором (РУС)
        /// </summary>
        public const int IdRotor = 5003;
        /// <summary>
        /// Замер ЗТС (запись MWD)
        /// </summary>
        public const int IdStaticSurveying = 5004;
        /// <summary>
        /// Промывка перед наращиванием
        /// </summary>
        public const int IdFlashingBeforeConnection = 5005;
        /// <summary>
        /// Проработка перед наращиванием
        /// </summary>
        public const int IdDevelopment = 5007;
        /// <summary>
        /// Шаблонировка во время бурения
        /// </summary>
        public const int IdTemplatingWhileDrilling = 5008;
        /// <summary>
        /// Шаблонировка перед наращиванием
        /// </summary>
        public const int IdTemplating = 5009;
        /// <summary>
        /// Удержание в клиньях
        /// </summary>
        public const int IdSlipsTime = 5011;
        /// <summary>
        /// Подъем КНБК
        /// </summary>
        public const int IdBhaUp = 5013;
        /// <summary>
        /// Спуск КНБК
        /// </summary>
        public const int IdBhaDown = 5015;
        /// <summary>
        /// Спуск ОК
        /// </summary>
        public const int IdCasingDown = 5017;
        /// <summary>
        /// Промывка
        /// </summary>
        public const int IdFlashing = 5036;
        /// <summary>
        /// Ремонт бурового оборудования
        /// </summary>
        public const int IdEquipmentRepair = 5058;
        /// <summary>
        /// Список всех категорий НПВ
        /// </summary>
        public static readonly int[] NonProductiveTimeSubIds = {
            IdEquipmentRepair,
            5059,
            5060,
            5061,
            5062,
            5063,
            5064,
            5065,
            5066,
            5067,
            5068,
            5069,
            5070,
            5071,
            5072,
            5073,
            5074,
            5075,
            5076,
            5077,
            5078,
            5079,
            5101,
            
            4014,
            4015,
            4016,
            4017,

            IdNonProductiveTime,
        };

        public static readonly int[] MechanicalDrillingSubIds = { IdRotor, IdSlide, IdMechanicalDrilling, };
        #endregion

        [Key]
        [Column("id")]
        public int Id { get; set; }

        [Column("name"), Comment("Название категории операции")]
        public string Name { get; set; } = null!;

        [Column("id_parent"), Comment("id родительской категории")]
        public int? IdParent { get; set; }

        [Column("key_value_name"), Comment("Название ключевого показателя операции"), StringLength(32)]
        public string? KeyValueName { get; set; }

        [Column("key_value_units"), Comment("Единицы измерения ключевого показателя операции"), StringLength(16)]
        public string? KeyValueUnits { get; set; }

        [JsonIgnore]
        [ForeignKey(nameof(IdParent))]
        public virtual WellOperationCategory? Parent { get; set; } = null!;
    }
}