using Microsoft.EntityFrameworkCore;
using PARR.Domain.Entities.Base;
using PARR.Domain.Entities.Base.History;
using PARR.Domain.Entities.Base.History.Base;
using PARR.Domain.Entities.Job;
using PARR.Domain.Enums;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace PARR.Domain.Entities
{
    [Table("Templates")]
    [Index(nameof(Name), nameof(Index), IsUnique = true)]
    public class Template : IBaseEntity, ITemplateGeneralProps, IHistoryInitiator, IMyHistory<TemplateHistory>
    {
        [Key]
        public Guid Id { get; set; }

        public DateTimeOffset DateCreated { get; set; }

        public DateTimeOffset? DateModified { get; set; }

        public required string Name { get; set; }

        /// <summary>
        /// Индекс, используется в групповых шаблонах
        /// </summary>
        public int? Index { get; set; }

        public bool IsActiveTemplate { get; set; }

        public bool IsActiveSchedule { get; set; }

        /// <summary>
        /// Номер расписания еспп
        /// </summary>
        public string? ScheduleEsppId { get; set; }


        ///// <summary>
        ///// Следующая дата срабатываения генерации наряда
        ///// </summary>
        //public DateTimeOffset NextScheduleStart { get; set; }

        ///// <summary>
        ///// Следующа дата выполнения скрипта агентом. Может быть нулл если шаблон не автоматический (не выполняется скриптом)
        ///// </summary>
        //public DateTimeOffset? NextScriptStart { get; set; }


        public DateTimeOffset? LastRun { get; set; }

        public DateTimeOffset NextRun { get; set; }

        //public Guid ApplicationInWorkId { get; set; }

        public Guid JobId { get; set; }

        public Guid UnitId { get; set; }

        public TemplateStatusTypeEnum StatusTypeId { get; set; } = TemplateStatusTypeEnum.Used;

        //public Guid HostId { get; set; }

        #region Initiator
        public string? InitiatorIp { get; set; }

        public ParrComponentsEnum? InitiatorParrComponentId { get; set; }

        public string? InitiatorComment { get; set; }
        #endregion

        //[ForeignKey(nameof(ApplicationInWorkId))]
        //public ApplicationsInWork? ApplicationsInWork { get; set; }

        //[ForeignKey(nameof(HostId))]
        //public Host? Host { get; set; }

        [ForeignKey(nameof(JobId))]
        public Job.Job? Job { get; set; }

        [ForeignKey(nameof(UnitId))]
        public Unit.Unit? Unit { get; set; }


        public ICollection<RobotConfiguration> RobotConfigurations { get; set; } = new HashSet<RobotConfiguration>();

        public ICollection<AgentHistory> AgentHistories { get; set; } = new HashSet<AgentHistory>();

        public ICollection<Order> Orders { get; set; } = new HashSet<Order>();

        public ICollection<TemplateHistory> TemplateHistories { get; set; } = new HashSet<TemplateHistory>();

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

        public TemplateStatusType? StatusType { get; set; }
    }
}
