using TakeoutSaaS.Domain.Identity.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;

namespace TakeoutSaaS.Domain.Identity.Entities;

/// <summary>
/// 管理后台账户实体（租户管理员或商户员工）。
/// </summary>
public sealed class IdentityUser : MultiTenantEntityBase
{
    /// <summary>
    /// 登录账号。
    /// </summary>
    public string Account { get; set; } = string.Empty;

    /// <summary>
    /// 展示名称。
    /// </summary>
    public string DisplayName { get; set; } = string.Empty;

    /// <summary>
    /// 密码哈希。
    /// </summary>
    public string PasswordHash { get; set; } = string.Empty;

    /// <summary>
    /// 手机号（租户内唯一）。
    /// </summary>
    public string? Phone { get; set; }

    /// <summary>
    /// 邮箱（租户内唯一）。
    /// </summary>
    public string? Email { get; set; }

    /// <summary>
    /// 账号状态。
    /// </summary>
    public IdentityUserStatus Status { get; set; } = IdentityUserStatus.Active;

    /// <summary>
    /// 登录失败次数。
    /// </summary>
    public int FailedLoginCount { get; set; }

    /// <summary>
    /// 锁定截止时间（UTC）。
    /// </summary>
    public DateTime? LockedUntil { get; set; }

    /// <summary>
    /// 最近登录时间（UTC）。
    /// </summary>
    public DateTime? LastLoginAt { get; set; }

    /// <summary>
    /// 是否强制修改密码。
    /// </summary>
    public bool MustChangePassword { get; set; }

    /// <summary>
    /// 所属商户（租户管理员为空）。
    /// </summary>
    public long? MerchantId { get; set; }

    /// <summary>
    /// 头像地址。
    /// </summary>
    public string? Avatar { get; set; }

    /// <summary>
    /// 并发控制字段。
    /// </summary>
    public byte[] RowVersion { get; set; } = Array.Empty<byte>();
}
