using Domain.Entities.Members.ValueObject;

namespace Application.Features.Admin.Member.List.Get;

public sealed class Response
{
    public int ID { get; init; }
    public string SID { get; init; } = "";
    public required string Email { get; init; }
    public string? Name { get; init; }
    public string? FullName { get; init; }
    public string? FirstName { get; init; }
    public string? LastName { get; init; }
    public string? Phone { get; init; }
    public DateOnly? Birthday { get; init; }
    public Gender? Gender { get; init; }
    public string? Summary { get; init; }
    public string? Intro { get; init; }
    public string? Thumb { get; init; }
    public string? Icon { get; init; }
    public int? MemberGradeID { get; init; }
    public string? GradeName { get; init; }
    public bool IsEmailVerified { get; init; }
    public bool IsAuthCertified { get; init; }
    public bool IsDenied { get; init; }
    public bool IsAdmin { get; init; }
    public bool IsWithdraw { get; init; }
    public bool IsCreator { get; init; }
    public string? DeviceInfo { get; init; }
    public string? SignupIP { get; init; }
    public string? LastLoginIp { get; init; }
    public string? IpAddress { get; init; }
    public string? UserAgent { get; init; }
    public DateTime? LastLoginAt { get; init; }
    public DateTime? EmailVerifiedAt { get; init; }
    public DateTime? AuthCertifiedAt { get; init; }
    public DateTime? DeniedAt { get; init; }
    public DateTime? DeletedAt { get; init; }
    public DateTime? UpdatedAt { get; init; }
    public DateTime CreatedAt { get; init; }
    public long Following { get; init; }
    public long Followed { get; init; }

    // Channel
    public ChannelInfo? Channel { get; init; }

    // Wallet
    public WalletInfo Wallet { get; init; } = new();

    public sealed class ChannelInfo
    {
        public string SID { get; init; } = "";
        public string Name { get; init; } = "";
        public string? Handle { get; init; }
        public string YouTubeUrl { get; init; } = "";
    }

    public sealed class WalletInfo
    {
        public long Balance { get; init; }
        public long CreditBalance { get; init; }
    }
}