using PARR.Domain.Common.Template;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;

namespace PARR.Domain.Settings
{
    /// <summary>
    /// Настройки из БД
    /// </summary>
    public class SettingsFromDb
    {
        // При добавлении свойств, добавлять в миграцию: PARR.DAL.Context.DataContext

        /// <summary>
        /// Инициатор регламентной работы, указывается при создании шаблона в ЕСПП.
        /// </summary>
        public string Initiator { get; set; } = string.Empty;

        /// <summary>
        /// Код закрытия регламентной работы, указывается при создании шаблона в ЕСПП.
        /// </summary>
        public string ClosingCode { get; set; } = string.Empty;

        /// <summary>
        /// Категория создаваемого объекта в ЕСПП
        /// </summary>
        public string Category { get; set; } = string.Empty;

        /// <summary>
        /// Префикс имени шаблона в ЕСПП с динамичным префиксом %PREFIX%-
        /// </summary>
        public string TemplatePrefixName { get; set; } = string.Empty;

        /// <summary>
        /// Префикс имени шаблона в ЕСПП без динамичного префикса (используется для подстановки в полное описание наряда/шаблона)
        /// </summary>
        public string TemplatePrefixWithoutVariable => TemplatePrefixName.Replace("%PREFIX%-", "");

        public string TemplateNameConstantParts { get; set; } = string.Empty;

        [NotMapped]
        public List<TemplateNameConstantPart> TemplateNameConstantPartsList
        {
            get
            {
                if (!string.IsNullOrEmpty(TemplateNameConstantParts))
                {
                    try
                    {
                        return JsonSerializer.Deserialize<List<TemplateNameConstantPart>>(TemplateNameConstantParts) ?? new List<TemplateNameConstantPart>();
                    }
                    catch (Exception ex)
                    {
                        // В будущем можно добавить логирование ошибки десериализации
                        return new List<TemplateNameConstantPart>();
                    }
                }

                return new List<TemplateNameConstantPart>();
            }
            set
            {
                if (value != null)
                {
                    //TemplateNameConstantParts = value.ToJson() ?? string.Empty;
                    try
                    {
                        TemplateNameConstantParts = JsonSerializer.Serialize(value, new JsonSerializerOptions { Encoder = JavaScriptEncoder.Create(UnicodeRanges.All, UnicodeRanges.Cyrillic) });
                    }
                    catch
                    {
                        TemplateNameConstantParts = string.Empty; 
                    }
                }


            }
        }

        /// <summary>
        /// Количество попыток выполнения задания роботом
        /// </summary>
        public int RobotAttemptsNumber { get; set; }

        /// <summary>
        /// Время ожидания выполнения роботом задания
        /// </summary>
        public TimeSpan RobotWaitTime { get; set; }

        /// <summary>
        /// Расписание регламентной работы, В каком часовом поясе
        /// </summary>
        public string EsppScheduleTimezone { get; set; } = string.Empty;

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

        ///// <summary>
        ///// Расписание регламентной работы - Календарь
        ///// </summary>
        //public string ScheduleExcludeCalendar { get; set; } = string.Empty;

        /// <summary>
        /// Расписание регламентной работы - Диапазон повторов
        /// </summary>
        public string ScheduleRepeatRange { get; set; } = string.Empty;

        /// <summary>
        /// Промежуток времени для поиска нарядов в ЕСПП
        /// </summary>
        public TimeSpan OrderSearchDeltaDate { get; set; }

        /// <summary>
        /// Таймзона УЗ роботов в ЕСПП, в часах (может быть положительным и отрицательным)
        /// </summary>
        public int EsppRobotAccountTimeZoneHour { get; set; }

        /// <summary>
        /// Время хранения в кэше данных о выходных и рабочих днях
        /// </summary>
        public TimeSpan WeekendCacheTtl { get; set; } = new TimeSpan(0, 5, 0);

        /// <summary>
        /// Префикс тега в поле ЭК "Дополнительная информация"
        /// </summary>
        public string EsppUnitTag { get; set; } = string.Empty;

        /// <summary>
        /// Job в который перемещаем ниспользованные шаблоны
        /// </summary>
        public Guid JobIdForUnusedTemplates { get; set; }

        /// <summary>
        /// Зона ответственности для получения тайм зоны по умолчанию для расписаний
        /// </summary>
        public string DefaultResponseAreaToTimeOffset { get; set; } = string.Empty;
    }
}