// EN: Interface for social login service
// VI: Interface cho social login service
using IamService.Domain.AggregatesModel.UserAggregate;

namespace IamService.Infrastructure.SocialLogin;

/// <summary>
/// EN: Result of external authentication.
/// VI: Kết quả xác thực bên ngoài.
/// </summary>
public record ExternalAuthResult
{
    /// <summary>
    /// EN: Whether authentication was successful.
    /// VI: Xác thực có thành công không.
    /// </summary>
    public bool Success { get; init; }

    /// <summary>
    /// EN: Error message if authentication failed.
    /// VI: Thông báo lỗi nếu xác thực thất bại.
    /// </summary>
    public string? ErrorMessage { get; init; }

    /// <summary>
    /// EN: External provider name (Google, Facebook).
    /// VI: Tên provider bên ngoài (Google, Facebook).
    /// </summary>
    public string? Provider { get; init; }

    /// <summary>
    /// EN: User ID from external provider.
    /// VI: User ID từ provider bên ngoài.
    /// </summary>
    public string? ProviderUserId { get; init; }

    /// <summary>
    /// EN: User email from external provider.
    /// VI: Email người dùng từ provider bên ngoài.
    /// </summary>
    public string? Email { get; init; }

    /// <summary>
    /// EN: User name from external provider.
    /// VI: Tên người dùng từ provider bên ngoài.
    /// </summary>
    public string? Name { get; init; }

    /// <summary>
    /// EN: Profile picture URL.
    /// VI: URL ảnh đại diện.
    /// </summary>
    public string? PictureUrl { get; init; }

    /// <summary>
    /// EN: The user if already exists or was created.
    /// VI: User nếu đã tồn tại hoặc được tạo mới.
    /// </summary>
    public ApplicationUser? User { get; init; }

    /// <summary>
    /// EN: Whether this is a new user registration.
    /// VI: Đây có phải là đăng ký người dùng mới không.
    /// </summary>
    public bool IsNewUser { get; init; }
}

/// <summary>
/// EN: Interface for handling social login operations.
/// VI: Interface xử lý các thao tác social login.
/// </summary>
public interface ISocialLoginService
{
    /// <summary>
    /// EN: Process external login callback and create/link user.
    /// VI: Xử lý callback đăng nhập bên ngoài và tạo/liên kết user.
    /// </summary>
    /// <param name="provider">Provider name (Google, Facebook)</param>
    /// <param name="providerUserId">User ID from provider</param>
    /// <param name="email">User email</param>
    /// <param name="name">User name</param>
    /// <param name="pictureUrl">Profile picture URL</param>
    /// <returns>External authentication result</returns>
    Task<ExternalAuthResult> ProcessExternalLoginAsync(
        string provider,
        string providerUserId,
        string email,
        string? name,
        string? pictureUrl);

    /// <summary>
    /// EN: Link external account to existing user.
    /// VI: Liên kết tài khoản bên ngoài với user hiện tại.
    /// </summary>
    /// <param name="userId">Existing user ID</param>
    /// <param name="provider">Provider name</param>
    /// <param name="providerUserId">User ID from provider</param>
    /// <returns>Success result</returns>
    Task<bool> LinkExternalAccountAsync(Guid userId, string provider, string providerUserId);

    /// <summary>
    /// EN: Unlink external account from user.
    /// VI: Hủy liên kết tài khoản bên ngoài khỏi user.
    /// </summary>
    /// <param name="userId">User ID</param>
    /// <param name="provider">Provider name</param>
    /// <returns>Success result</returns>
    Task<bool> UnlinkExternalAccountAsync(Guid userId, string provider);

    /// <summary>
    /// EN: Get linked external accounts for user.
    /// VI: Lấy danh sách tài khoản bên ngoài đã liên kết của user.
    /// </summary>
    /// <param name="userId">User ID</param>
    /// <returns>List of provider names</returns>
    Task<IEnumerable<string>> GetLinkedProvidersAsync(Guid userId);
}
