using foodmarket.Domain.Common;

namespace foodmarket.Domain.Organizations;

/// <summary>Сотрудник организации. Может быть привязан к учётной записи
/// (UserId), а может существовать без логина (например, кассир, которого
/// добавили в HR, но логин ещё не выдали).</summary>
public class Employee : TenantEntity
{
    /// <summary>FK на Identity-юзера. Заполняется когда сотруднику выдан логин.
    /// Null — запись без учётки.</summary>
    public Guid? UserId { get; set; }

    public string LastName { get; set; } = "";
    public string FirstName { get; set; } = "";
    public string? MiddleName { get; set; }
    public string? Position { get; set; }

    public string? Email { get; set; }
    public string? Phone { get; set; }

    /// <summary>Оклад в валюте организации, опц.</summary>
    public decimal? Salary { get; set; }
    /// <summary>ИИН (12 цифр для физлица в РК), опционально.</summary>
    public string? TaxNumber { get; set; }
    /// <summary>Произвольное описание (комментарий HR'а).</summary>
    public string? Description { get; set; }
    /// <summary>Аватар сотрудника. URL до файла в общем images-стораж.</summary>
    public string? ImageUrl { get; set; }

    public Guid RoleId { get; set; }
    public EmployeeRole Role { get; set; } = null!;

    /// <summary>Активен ли сотрудник. False — заблокирован, не может логиниться.
    /// Двухступенчатое удаление: сначала «Уволить» (IsActive=false + FiredAt),
    /// затем «Удалить» (IsDeleted=true + DeletedAt). Физически не удаляем
    /// никогда — у сотрудника есть FK из документов (продаж, поставок).</summary>
    public bool IsActive { get; set; } = true;
    public DateTime? FiredAt { get; set; }

    /// <summary>Soft-delete-флаг. Ставится только из состояния «уволен» (IsActive=false).
    /// В UI и связанных документах отображается «Иванов И.И. (удалён)».
    /// В списках сотрудников по умолчанию скрыты, доступны через фильтр.</summary>
    public bool IsDeleted { get; set; }
    public DateTime? DeletedAt { get; set; }

    public ICollection<EmployeeRetailPointAssignment> RetailPointAssignments { get; set; }
        = new List<EmployeeRetailPointAssignment>();
}

/// <summary>Привязка сотрудника к кассе (для роли Кассир): к каким RetailPoint'ам
/// он может вставать. Если назначений нет — может ко всем (поведение по умолчанию).</summary>
public class EmployeeRetailPointAssignment : TenantEntity
{
    public Guid EmployeeId { get; set; }
    public Employee Employee { get; set; } = null!;
    public Guid RetailPointId { get; set; }
}
