using System.ComponentModel.DataAnnotations;

namespace Nexus.Api.DTOs;

public sealed record LoginRequest
{
    [Required, EmailAddress, MaxLength(120)]
    public string Email { get; init; } = string.Empty;

    [Required, MinLength(10), MaxLength(200)]
    public string Password { get; init; } = string.Empty;
}

public sealed record AuthResponse
{
    public string AccessToken { get; init; } = string.Empty;
    public DateTimeOffset ExpiresAt { get; init; }
    public UserInfo User { get; init; } = new();
}

public sealed record UserInfo
{
    public Guid Id { get; init; }
    public string Email { get; init; } = string.Empty;
    public string DisplayName { get; init; } = string.Empty;
    public string Role { get; init; } = string.Empty;
}

public sealed record AdminUserInfo
{
    public Guid Id { get; init; }
    public string Email { get; init; } = string.Empty;
    public string DisplayName { get; init; } = string.Empty;
    public string Role { get; init; } = string.Empty;
    public DateTimeOffset CreatedAt { get; init; }
    public DateTimeOffset? LastLoginAt { get; init; }
}

public sealed record AdminCreateUserRequest
{
    public string Email { get; init; } = string.Empty;
    public string Password { get; init; } = string.Empty;
    public string? DisplayName { get; init; }
    public string? Role { get; init; }
}

public sealed record AdminUpdateRoleRequest
{
    public string Role { get; init; } = string.Empty;
}

public sealed record UpdateProfileRequest
{
    [MaxLength(100)]
    public string? DisplayName { get; init; }
}

public sealed record ChangePasswordRequest
{
    [Required, MinLength(10), MaxLength(200)]
    public string CurrentPassword { get; init; } = string.Empty;

    [Required, MinLength(10), MaxLength(200)]
    public string NewPassword { get; init; } = string.Empty;
}
