using MktZaloService.Domain.SeedWork;

namespace MktZaloService.Domain.AggregatesModel.CustomerAggregate;

/// <summary>
/// EN: Value object representing customer profile information.
/// VI: Value object đại diện cho thông tin hồ sơ khách hàng.
/// </summary>
public class CustomerProfile : ValueObject
{
    /// <summary>
    /// EN: Display name from Zalo profile.
    /// VI: Tên hiển thị từ hồ sơ Zalo.
    /// </summary>
    public string DisplayName { get; private set; } = string.Empty;

    /// <summary>
    /// EN: Avatar URL from Zalo profile.
    /// VI: URL ảnh đại diện từ hồ sơ Zalo.
    /// </summary>
    public string? AvatarUrl { get; private set; }

    /// <summary>
    /// EN: Phone number (manually provided or from Zalo).
    /// VI: Số điện thoại (nhập thủ công hoặc từ Zalo).
    /// </summary>
    public string? PhoneNumber { get; private set; }

    /// <summary>
    /// EN: Email address (manually provided).
    /// VI: Địa chỉ email (nhập thủ công).
    /// </summary>
    public string? Email { get; private set; }

    /// <summary>
    /// EN: Required by EF Core.
    /// VI: Yêu cầu bởi EF Core.
    /// </summary>
    protected CustomerProfile() { }

    /// <summary>
    /// EN: Create a new customer profile.
    /// VI: Tạo hồ sơ khách hàng mới.
    /// </summary>
    public CustomerProfile(
        string displayName,
        string? avatarUrl = null,
        string? phoneNumber = null,
        string? email = null)
    {
        if (string.IsNullOrWhiteSpace(displayName))
        {
            throw new ArgumentException("Display name cannot be empty", nameof(displayName));
        }

        DisplayName = displayName;
        AvatarUrl = avatarUrl;
        PhoneNumber = phoneNumber;
        Email = email;
    }

    protected override IEnumerable<object?> GetEqualityComponents()
    {
        yield return DisplayName;
        yield return AvatarUrl;
        yield return PhoneNumber;
        yield return Email;
    }
}
