import {
  ArrayMinSize,
  IsArray,
  IsNotEmpty,
  IsOptional,
  IsString,
  IsUUID,
  MaxLength,
} from 'class-validator';

/**
 * 创建单条角色级授权
 */
export class CreateRoleGrantDto {
  @IsUUID()
  roleId: string;

  @IsString()
  @IsNotEmpty()
  @MaxLength(128)
  toolName: string;
}

/**
 * 批量创建角色级授权（同一 roleId 下多个工具一次性保存）
 * 使用 upsert 语义：已存在的 (roleId, toolName) 不报错，直接跳过
 */
export class BatchCreateRoleGrantsDto {
  @IsUUID()
  roleId: string;

  @IsArray()
  @ArrayMinSize(1)
  @IsString({ each: true })
  @MaxLength(128, { each: true })
  toolNames: string[];
}

/**
 * 查询角色级授权规则
 */
export class RoleGrantQueryDto {
  @IsUUID()
  @IsOptional()
  roleId?: string;
}

/**
 * 创建用户级授权（例外维度）
 * reason 在 API 层强制必填，便于事后审计"为什么给这个用户开小灶"
 * DB 层 reason 保持 nullable，避免将来系统化插入时被卡住
 */
export class CreateUserGrantDto {
  @IsUUID()
  userId: string;

  @IsString()
  @IsNotEmpty()
  @MaxLength(128)
  toolName: string;

  @IsString()
  @IsNotEmpty()
  @MaxLength(500)
  reason: string;
}

/**
 * 查询用户级授权规则
 */
export class UserGrantQueryDto {
  @IsUUID()
  @IsOptional()
  userId?: string;
}
