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

namespace PARR.Domain.Entities.TaskEntities
{
    [Table("Tasks", Schema = DatabaseSchemas.Task)]
    [Comment("Таблица заданий")]
    public class TaskItem : IBaseEntity, IHistoryInitiator
    {
        [Key]
        public Guid Id { get; set; }

        public DateTimeOffset DateCreated { get; set; }

        [ManualControl]
        public DateTimeOffset? DateModified { get; set; }

        public TaskTypeEnum TypeCode { get; set; }

        public TaskItemStatusEnum StatusCode { get; set; }

        public string? Payload { get; set; }

        /// <summary>
        /// Кол-во попыток
        /// </summary>
        public int RetryCount { get; set; }

        /// <summary>
        /// Дата завершения (устанавливается или когда Успех или когда Ошибка)
        /// </summary>
        public DateTimeOffset? ProcessedAt { get; set; }

        /// <summary>
        /// Процент выполнения задачи (0-100).
        /// null = ожидает начала, 100 = успешно завершена.
        /// При ошибке сохраняется последнее значение.
        /// </summary>
        [Comment("Процент выполнения задачи")]
        public int? ProgressPercent { get; set; }


        public string? InitiatorIp { get; set; }
        public ParrComponentsEnum? InitiatorParrComponentId { get; set; }
        public string? InitiatorComment { get; set; }


        [ForeignKey(nameof(TypeCode))]
        public TaskType? TaskType { get; set; }

        [ForeignKey(nameof(StatusCode))]
        public TaskStatus? TaskStatus { get; set; }

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