using SocialService.Domain.Exceptions;
using SocialService.Domain.SeedWork;

namespace SocialService.Domain.AggregatesModel.UserProfileAggregate;

/// <summary>
/// EN: Aggregate root for user profile data synced from IAM Service.
/// VI: Aggregate root cho dữ liệu hồ sơ user được đồng bộ từ IAM Service.
/// </summary>
public class UserProfile : Entity, IAggregateRoot
{
    // EN: Private fields for encapsulation
    // VI: Fields private để đóng gói
    private Guid _userId;
    private string _displayName = null!;
    private string? _avatarUrl;
    private string? _bio;
    private DateTime _lastSyncedAt;
    private DateTime _createdAt;

    /// <summary>
    /// EN: User ID from IAM Service.
    /// VI: ID user từ IAM Service.
    /// </summary>
    public Guid UserId => _userId;

    /// <summary>
    /// EN: User's display name.
    /// VI: Tên hiển thị của user.
    /// </summary>
    public string DisplayName => _displayName;

    /// <summary>
    /// EN: URL to user's avatar image.
    /// VI: URL đến ảnh avatar của user.
    /// </summary>
    public string? AvatarUrl => _avatarUrl;

    /// <summary>
    /// EN: User's bio/description.
    /// VI: Tiểu sử/mô tả của user.
    /// </summary>
    public string? Bio => _bio;

    /// <summary>
    /// EN: Last time the profile was synced from IAM.
    /// VI: Lần cuối hồ sơ được đồng bộ từ IAM.
    /// </summary>
    public DateTime LastSyncedAt => _lastSyncedAt;

    /// <summary>
    /// EN: Creation timestamp.
    /// VI: Thời gian tạo.
    /// </summary>
    public DateTime CreatedAt => _createdAt;

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

    /// <summary>
    /// EN: Create a new user profile from IAM data.
    /// VI: Tạo hồ sơ user mới từ dữ liệu IAM.
    /// </summary>
    /// <param name="userId">EN: User ID from IAM / VI: ID user từ IAM</param>
    /// <param name="displayName">EN: Display name / VI: Tên hiển thị</param>
    /// <param name="avatarUrl">EN: Avatar URL / VI: URL avatar</param>
    /// <param name="bio">EN: Bio / VI: Tiểu sử</param>
    public UserProfile(Guid userId, string displayName, string? avatarUrl = null, string? bio = null) : this()
    {
        if (userId == Guid.Empty)
            throw new SocialDomainException("User ID cannot be empty");
        if (string.IsNullOrWhiteSpace(displayName))
            throw new SocialDomainException("Display name cannot be empty");

        Id = Guid.NewGuid();
        _userId = userId;
        _displayName = displayName;
        _avatarUrl = avatarUrl;
        _bio = bio;
        _lastSyncedAt = DateTime.UtcNow;
        _createdAt = DateTime.UtcNow;
    }

    /// <summary>
    /// EN: Update profile from IAM integration event.
    /// VI: Cập nhật hồ sơ từ IAM integration event.
    /// </summary>
    /// <param name="displayName">EN: New display name / VI: Tên hiển thị mới</param>
    /// <param name="avatarUrl">EN: New avatar URL / VI: URL avatar mới</param>
    /// <param name="bio">EN: New bio / VI: Tiểu sử mới</param>
    public void UpdateFromEvent(string displayName, string? avatarUrl, string? bio = null)
    {
        if (string.IsNullOrWhiteSpace(displayName))
            throw new SocialDomainException("Display name cannot be empty");

        _displayName = displayName;
        _avatarUrl = avatarUrl;
        _bio = bio;
        _lastSyncedAt = DateTime.UtcNow;
    }
}
