using Microsoft.EntityFrameworkCore;
using PARR.Domain.Constants;
using PARR.Domain.Entities.Base;
using PARR.Domain.Entities.Schedule;
using PARR.Domain.Entities.Unit;
using PARR.Domain.Settings;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace PARR.Domain.Entities.Job
{
    [Table("Groups", Schema = DatabaseSchemas.Job)]
    [Comment("Таблица описания групп работ, для реализации зонтиков")]
    public class JobGroup : IBaseEntity
    {
        [Key]
        public Guid Id { get; set; }

        public DateTimeOffset DateCreated { get; set; }

        public DateTimeOffset? DateModified { get; set; }

        /// <summary>
        /// Наименование работ для интерфеса в ПАРР
        /// </summary>
        public required string GroupName { get; set; }

        ///// <summary>
        ///// Связана ли работа с групповыми ЭК(зонтами)
        ///// </summary>
        //public bool? IsUmbrella { get; set; }

        /// <summary>
        /// Поле Короткое описания шаблона АСУ ЕСПП
        /// </summary>
        public required string ShortDescription { get; set; }

        /// <summary>
        /// Поле Подробное описания шаблона АСУ ЕСПП
        /// </summary>
        private string _fullDescription = string.Empty;
        public required string FullDescription
        {
            get
            {
                //В полное описание подставляем префикс, для дальнейшего поиска наряда
                return $"{_fullDescription}\r\n{PrefixSettings.PrefixWithoutVariable}";
            }
            set
            {
                //удаляем префикс, если он есть
                //_fullDescription = value.Replace($"\r\n{PrefixSettings.PrefixWithoutVariable}", string.Empty);
                _fullDescription = value.Replace($"{PrefixSettings.PrefixWithoutVariable}", string.Empty).TrimEnd();
            }
        }
        //public required string FullDescription { get; set; }

        /// <summary>
        /// Поле Решение описания шаблона АСУ ЕСПП
        /// </summary>
        public required string Solution { get; set; }

        /// <summary>
        /// Поле Длительность описания шаблона АСУ ЕСПП
        /// </summary>
        public required string TemplateDuration { get; set; }

        /// <summary>
        /// TemplateDuration в формате TimeSpan
        /// </summary>
        public TimeSpan? TemplateDurationTimeSpan
        {
            get
            {
                try
                {
                    //ЕСПП кривоногие, они почему-то таймспан пишут так "7 00:00:00", а правильно так: "7:00:00:00"
                    var durationWithTimeSpanFormat = TemplateDuration.Replace(" ", ":");

                    return TimeSpan.Parse(durationWithTimeSpanFormat);
                }
                catch
                {
                    return null;
                }
            }
        }

        /// <summary>
        /// Дата начала работ или дата для отсчёта периода следующего выполнения
        /// </summary>
        public DateTimeOffset ReferenceDate { get; set; }


        /// <summary>
        /// Смещение часового пояса пользователя в минутах относительно UTC на момент ReferenceDate
        /// </summary>
        [Comment("Смещение часового пояса пользователя в минутах относительно UTC на момент ReferenceDate")]
        public int? UserTimeZoneOffsetMinutes { get; set; }

        /// <summary>
        /// Смещение часового пояса пользователя относительно UTC на момент ReferenceDate, рассчитывается из поля UserTimeZoneOffsetMinutes
        /// </summary>
        [NotMapped]
        public TimeSpan? UserTimeZoneOffset =>
                            UserTimeZoneOffsetMinutes.HasValue
                                ? TimeSpan.FromMinutes(UserTimeZoneOffsetMinutes.Value)
                                : null;

        /// <summary>
        /// Использовать таймзону рабочей группы ответственного за ЭК шаблона
        /// </summary>
        public bool IsResponseAreaTimezone { get; set; } = false;


        /// <summary>
        /// Включить автораспределение
        /// </summary>
        public bool IsAutoDistributionEnabled { get; set; }

        /// <summary>
        /// Выполняет агент
        /// </summary>
        public bool IsAgent { get; set; }

        /// <summary>
        /// Какое-то имя которое мы передаем агенту, пока непонятно что это такое.
        /// </summary>
        public string? AgentName { get; set; }

        /// <summary>
        /// Сколько времени ожидать выполнение скрипта агентом (секунд)
        /// </summary>
        public int? AgentTimeOutSec { get; set; }

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

        /// <summary>
        /// Тип группы
        /// </summary>
        public Guid GroupTypeId { get; set; }


        /// <summary>
        /// Если тип группы - "Сгруппированный", то это поле обязательно, по нему будем группировать 
        /// TODO: !!!! Связь с иаблице UnitField не создавалась! Нужно это переделать и унести в отдельную таблицу
        /// </summary>
        public Guid? GroupingUnitFieldId { get; set; }


        /// <summary>
        /// Группировать по ответственному за ЭК.
        /// Если тип группы - "Сгруппированный", то можно менять значение этого поля, в иных случаях - null
        /// TODO: По хорошему вынести это в другую таблицу, так как это касается только групповых работ
        /// </summary>
        public bool? IsGroupByResponsible { get; set; }


        /// <summary>
        /// Расписание регламентной работы - Тип исключения
        /// </summary>
        public Guid ScheduleExcludeTypeId { get; set; }

        /// <summary>
        /// Расписание регламентной работы, исключение - Календарь
        /// </summary>
        public Guid? ScheduleExcludeTypeCalendarId { get; set; }



        /// <summary>
        /// Поле по которому группируется (!!!отключено каскадное удаление!!!)
        /// </summary>
        [ForeignKey(nameof(GroupingUnitFieldId))]
        public UnitField? GroupingUnitField { get; set; }

        [ForeignKey(nameof(GroupTypeId))]
        public JobGroupType? GroupType { get; set; }

        public ICollection<Job> Jobs { get; set; } = new HashSet<Job>();

        public ICollection<EsppSchValue> EsppSchValues { get; set; } = new HashSet<EsppSchValue>();

        [ForeignKey(nameof(ScheduleExcludeTypeId))]
        public ScheduleExcludeType? ScheduleExcludeType { get; set; }

        [ForeignKey(nameof(ScheduleExcludeTypeCalendarId))]
        public ScheduleExcludeTypeCalendar? ScheduleExcludeTypeCalendar { get; set; }

        public JobGroupDistributionConfig? DistributionConfig { get; set; }
    }
}
