// EN: Device token entity for POS and push notifications.
// VI: Entity device token cho POS và push notifications.

using MerchantService.Domain.Exceptions;
using MerchantService.Domain.SeedWork;

namespace MerchantService.Domain.AggregatesModel.MerchantStaffAggregate;

/// <summary>
/// EN: Represents a registered device for staff (POS, Mobile).
/// VI: Đại diện cho thiết bị đã đăng ký của nhân viên (POS, Mobile).
/// </summary>
public class DeviceToken : Entity
{
    private Guid _staffId;
    private string _deviceId = null!;
    private string? _deviceName;
    private string? _fcmToken;
    private string _platform = null!;
    private DateTime? _lastUsedAt;
    private DateTime _createdAt;

    /// <summary>
    /// EN: Staff ID this device belongs to.
    /// VI: ID nhân viên sở hữu thiết bị này.
    /// </summary>
    public Guid StaffId => _staffId;

    /// <summary>
    /// EN: Unique device identifier.
    /// VI: Định danh thiết bị duy nhất.
    /// </summary>
    public string DeviceId => _deviceId;

    /// <summary>
    /// EN: Human-readable device name.
    /// VI: Tên thiết bị dễ đọc.
    /// </summary>
    public string? DeviceName => _deviceName;

    /// <summary>
    /// EN: Firebase Cloud Messaging token for push notifications.
    /// VI: Token Firebase Cloud Messaging cho push notifications.
    /// </summary>
    public string? FcmToken => _fcmToken;

    /// <summary>
    /// EN: Platform (ios, android, pos).
    /// VI: Nền tảng (ios, android, pos).
    /// </summary>
    public string Platform => _platform;

    /// <summary>
    /// EN: Last time this device was used.
    /// VI: Lần cuối thiết bị này được sử dụng.
    /// </summary>
    public DateTime? LastUsedAt => _lastUsedAt;

    /// <summary>
    /// EN: When the device was registered.
    /// VI: Thời điểm thiết bị được đăng ký.
    /// </summary>
    public DateTime CreatedAt => _createdAt;

    /// <summary>
    /// EN: Private constructor for EF Core.
    /// VI: Constructor private cho EF Core.
    /// </summary>
    protected DeviceToken()
    {
    }

    /// <summary>
    /// EN: Create a new device token.
    /// VI: Tạo device token mới.
    /// </summary>
    public DeviceToken(Guid staffId, string deviceId, string? deviceName, string? fcmToken, string platform)
    {
        if (staffId == Guid.Empty)
            throw new DomainException("Staff ID cannot be empty");
        if (string.IsNullOrWhiteSpace(deviceId))
            throw new DomainException("Device ID cannot be empty");
        if (string.IsNullOrWhiteSpace(platform))
            throw new DomainException("Platform cannot be empty");

        Id = Guid.NewGuid();
        _staffId = staffId;
        _deviceId = deviceId;
        _deviceName = deviceName;
        _fcmToken = fcmToken;
        _platform = platform.ToLowerInvariant();
        _createdAt = DateTime.UtcNow;
    }

    /// <summary>
    /// EN: Update FCM token.
    /// VI: Cập nhật FCM token.
    /// </summary>
    public void UpdateFcmToken(string? fcmToken)
    {
        _fcmToken = fcmToken;
    }

    /// <summary>
    /// EN: Update device name.
    /// VI: Cập nhật tên thiết bị.
    /// </summary>
    public void UpdateDeviceName(string? deviceName)
    {
        _deviceName = deviceName;
    }

    /// <summary>
    /// EN: Mark device as used now.
    /// VI: Đánh dấu thiết bị vừa được sử dụng.
    /// </summary>
    public void MarkUsed()
    {
        _lastUsedAt = DateTime.UtcNow;
    }
}
