using System;
using FreeSql.DataAnnotations;
using ZhonTai.Admin.Core.Entities;
using NPP.SmartSchedue.Api.Contracts.Core.Consts;

namespace NPP.SmartSchedue.Api.Contracts.Domain.Time;

/// <summary>
/// 员工班次不可用标记实体
/// 用于统一管理员工因个人意愿、培训任务、会议、设备维护、请假等原因无法工作的班次信息
/// </summary>
[Table(Name = DbConsts.TableNamePrefix + "shift_unavailability")]
[Index("ix_shift_unavailability_personnel_date", "PersonnelId,Date")]
[Index("ix_shift_unavailability_shift_date", "ShiftId,Date")]
[Index("ix_shift_unavailability_reason_date", "ReasonType,Date")]
public partial class ShiftUnavailabilityEntity : EntityTenant
{
    /// <summary>
    /// 员工ID
    /// </summary>
    public long PersonnelId { get; set; }

    /// <summary>
    /// 不可用日期
    /// </summary>
    public DateTime Date { get; set; }

    /// <summary>
    /// 不可用班次ID
    /// </summary>
    public long ShiftId { get; set; }

    /// <summary>
    /// 不可用原因类型 (使用int存储，对应UnavailabilityReasonType枚举)
    /// 1=个人意愿, 2=培训任务, 3=会议任务, 4=设备维护, 7=临时请假, 8=计划请假, 9=医疗原因, 10=家庭事务, 11=轮岗安排, 12=技能认证, 99=其他原因
    /// </summary>
    public int ReasonType { get; set; }

    /// <summary>
    /// 备注说明
    /// </summary>
    [Column(StringLength = 500)]
    public string Remark { get; set; }

    /// <summary>
    /// 是否为模板生成的记录
    /// 用于追踪通过模板复制或周期性设置生成的记录
    /// </summary>
    public bool IsFromTemplate { get; set; } = false;

    /// <summary>
    /// 来源模板日期
    /// 当IsFromTemplate=true时，记录模板的来源日期，用于追溯和管理
    /// </summary>
    public DateTime? SourceTemplateDate { get; set; }

    /// <summary>
    /// 优先级权重（用于冲突解决）
    /// 数值越大优先级越高，默认为1
    /// 当同一员工同一日期同一班次有多条记录时，优先级高的生效
    /// </summary>
    public int Priority { get; set; } = 1;

    /// <summary>
    /// 生效开始时间（可选，用于精确时间控制）
    /// 当需要精确控制不可用时间段时使用，如只在班次的某个时间段内不可用
    /// </summary>
    public TimeSpan? EffectiveStartTime { get; set; }

    /// <summary>
    /// 生效结束时间（可选，用于精确时间控制）
    /// 配合EffectiveStartTime使用，定义精确的不可用时间段
    /// </summary>
    public TimeSpan? EffectiveEndTime { get; set; }
}