package com.ttstd.signaling.controller.dto;

import jakarta.validation.constraints.NotBlank;

/**
 * 认证相关请求/响应 DTO 集合。
 */
public final class AuthDtos {

    private AuthDtos() {
    }

    // ==================== 主控端账号 ====================

    public record RegisterRequest(
            @NotBlank(message = "用户名不能为空") String username,
            @NotBlank(message = "密码不能为空") String password) {
    }

    /**
     * 登录请求。{@code totpCode} 仅在账号启用双因子时必填；
     * 未填时服务端返回 error=TOTP_REQUIRED，客户端据此引导用户输入动态码。
     */
    public record LoginRequest(
            @NotBlank(message = "用户名不能为空") String username,
            @NotBlank(message = "密码不能为空") String password,
            String totpCode) {
    }

    /** 启用 TOTP：提交一次动态码完成绑定。 */
    public record TotpEnableRequest(
            @NotBlank(message = "动态码不能为空") String code) {
    }

    /** 关闭 TOTP：需同时提供密码与动态码。 */
    public record TotpDisableRequest(
            @NotBlank(message = "密码不能为空") String password,
            @NotBlank(message = "动态码不能为空") String code) {
    }

    public record RefreshRequest(
            @NotBlank(message = "刷新令牌不能为空") String refreshToken) {
    }

    public record ChangePasswordRequest(
            @NotBlank(message = "原密码不能为空") String oldPassword,
            @NotBlank(message = "新密码不能为空") String newPassword) {
    }

    /** 登录/刷新响应。设备令牌场景 refreshToken 为 null。 */
    public record TokenResponse(
            String accessToken,
            String refreshToken,
            long expiresIn,
            String sessionId,
            String principalId,
            String displayName) {
    }

    // ==================== 被控端设备 ====================

    public record ProvisionRequest(
            @NotBlank(message = "SN 不能为空") String sn,
            String model,
            @NotBlank(message = "nonce 不能为空") String nonce,
            long timestamp,
            @NotBlank(message = "签名不能为空") String hmac) {
    }

    public record ProvisionResponse(
            String deviceUid,
            String deviceSecret,
            String notice) {
    }

    public record DeviceTokenRequest(
            @NotBlank(message = "deviceUid 不能为空") String deviceUid,
            @NotBlank(message = "deviceSecret 不能为空") String deviceSecret) {
    }
}
