/**
 * 表单定义 DTOs
 * 完全符合 API 文档规范
 */

import {
  IsString,
  IsOptional,
  IsBoolean,
  IsInt,
  IsObject,
  IsEnum,
  IsArray,
  Min,
  IsUUID,
} from 'class-validator';
import { Type } from 'class-transformer';
// import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';  // TODO: Install @nestjs/swagger
import { FormStatus } from '@prisma/client';

// ============================================
// 创建表单定义
// ============================================

export class CreateFormDefinitionDto {
  // @ApiPropertyOptional({
    // description: '表单 key（可选，不指定则自动生成）',
    // example: 'expense-reimbursement',
  // })
  @IsOptional()
  @IsString()
  key?: string;

  // @ApiProperty({
    // description: '表单 slug（URL 友好标识）',
    // example: 'expense-reimbursement',
  // })
  @IsString()
  slug: string;

  // @ApiProperty({
    // description: '表单名称（多语言）',
    // example: { 'zh-CN': '报销申请', 'en-US': 'Expense Report' },
  // })
  @IsObject()
  nameI18n: Record<string, string>;

  // @ApiPropertyOptional({
    // description: '表单描述（多语言）',
    // example: {
      // 'zh-CN': '员工报销费用申请',
      // 'en-US': 'Employee expense reimbursement',
    // },
  // })
  @IsOptional()
  @IsObject()
  descriptionI18n?: Record<string, string>;

  // @ApiProperty({
    // description: '表单分类',
    // example: 'finance',
    // enum: ['finance', 'hr', 'admin', 'it', 'other'],
  // })
  @IsString()
  category: string;

  // @ApiPropertyOptional({ description: '图标', example: 'Receipt' })
  @IsOptional()
  @IsString()
  icon?: string;

  // @ApiPropertyOptional({ description: '主题色', example: '#3b82f6' })
  @IsOptional()
  @IsString()
  color?: string;

  // @ApiProperty({
    // description: '默认语言',
    // example: 'zh-CN',
    // default: 'zh-CN',
  // })
  @IsString()
  defaultLocale: string;

  // @ApiProperty({
    // description: '支持的语言列表',
    // example: ['zh-CN', 'en-US'],
    // type: [String],
  // })
  @IsArray()
  @IsString({ each: true })
  supportedLocales: string[];

  // @ApiProperty({ description: '表单结构定义（JSON Schema）' })
  @IsObject()
  schema: any;

  // @ApiPropertyOptional({ description: 'UI 配置' })
  @IsOptional()
  @IsObject()
  uiSchema?: any;

  // @ApiPropertyOptional({ description: '验证规则' })
  @IsOptional()
  @IsObject()
  validation?: any;

  // @ApiPropertyOptional({
    // description: '翻译内容（按语言分组）',
    // example: {
      // 'zh-CN': { title: '报销申请', 'fields.amount.label': '金额' },
      // 'en-US': { title: 'Expense Report', 'fields.amount.label': 'Amount' },
    // },
  // })
  @IsOptional()
  @IsObject()
  translations?: Record<string, Record<string, string>>;

  // @ApiProperty({ description: '是否需要审批', default: false })
  @IsBoolean()
  requiresApproval: boolean;

  // @ApiPropertyOptional({ description: '关联的审批流 key' })
  @IsOptional()
  @IsString()
  approvalProcessKey?: string;

  // @ApiPropertyOptional({
    // description: '别名列表（用于 API 兼容）',
    // example: ['old-expense-form', 'expense-v1'],
    // type: [String],
  // })
  @IsOptional()
  @IsArray()
  @IsString({ each: true })
  aliases?: string[];
}

// ============================================
// 更新表单定义
// ============================================

export class UpdateFormDefinitionDto {
  // @ApiPropertyOptional({ description: '表单 slug' })
  @IsOptional()
  @IsString()
  slug?: string;

  // @ApiPropertyOptional({
    // description: '表单名称（多语言）',
    // example: { 'zh-CN': '报销申请', 'en-US': 'Expense Report' },
  // })
  @IsOptional()
  @IsObject()
  nameI18n?: Record<string, string>;

  // @ApiPropertyOptional({
    // description: '表单描述（多语言）',
  // })
  @IsOptional()
  @IsObject()
  descriptionI18n?: Record<string, string>;

  // @ApiPropertyOptional({ description: '表单分类' })
  @IsOptional()
  @IsString()
  category?: string;

  // @ApiPropertyOptional({ description: '图标' })
  @IsOptional()
  @IsString()
  icon?: string;

  // @ApiPropertyOptional({ description: '主题色' })
  @IsOptional()
  @IsString()
  color?: string;

  // @ApiPropertyOptional({ description: '默认语言' })
  @IsOptional()
  @IsString()
  defaultLocale?: string;

  // @ApiPropertyOptional({ description: '支持的语言列表', type: [String] })
  @IsOptional()
  @IsArray()
  @IsString({ each: true })
  supportedLocales?: string[];

  // @ApiPropertyOptional({ description: '是否需要审批' })
  @IsOptional()
  @IsBoolean()
  requiresApproval?: boolean;

  // @ApiPropertyOptional({ description: '关联的审批流 key' })
  @IsOptional()
  @IsString()
  approvalProcessKey?: string;

  // @ApiPropertyOptional({ description: '别名列表', type: [String] })
  @IsOptional()
  @IsArray()
  @IsString({ each: true })
  aliases?: string[];

  // @ApiPropertyOptional({ description: 'Slug 历史记录', type: [String] })
  @IsOptional()
  @IsArray()
  @IsString({ each: true })
  slugHistory?: string[];
}

// ============================================
// 查询表单定义
// ============================================

export class QueryFormDefinitionDto {
  // @ApiPropertyOptional({ description: '分类' })
  @IsOptional()
  @IsString()
  category?: string;

  // @ApiPropertyOptional({
    // description: '状态',
    // enum: FormStatus,
  // })
  @IsOptional()
  @IsEnum(FormStatus)
  status?: FormStatus;

  // @ApiPropertyOptional({ description: '是否需要审批' })
  @IsOptional()
  @Type(() => Boolean)
  @IsBoolean()
  requiresApproval?: boolean;

  // @ApiPropertyOptional({ description: '搜索关键词' })
  @IsOptional()
  @IsString()
  search?: string;

  // @ApiPropertyOptional({ description: '页码', default: 1, minimum: 1 })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  page?: number;

  // @ApiPropertyOptional({
    // description: '每页数量',
    // default: 20,
    // minimum: 1,
    // maximum: 100,
  // })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  limit?: number;
}

// ============================================
// 创建表单版本
// ============================================

export class CreateFormVersionDto {
  // @ApiProperty({ description: '表单结构定义（JSON Schema）' })
  @IsObject()
  schema: any;

  // @ApiPropertyOptional({ description: 'UI 配置' })
  @IsOptional()
  @IsObject()
  uiSchema?: any;

  // @ApiPropertyOptional({ description: '验证规则' })
  @IsOptional()
  @IsObject()
  validation?: any;

  // @ApiProperty({
    // description: '表单名称（多语言）',
    // example: { 'zh-CN': '报销申请', 'en-US': 'Expense Report' },
  // })
  @IsObject()
  nameI18n: Record<string, string>;

  // @ApiPropertyOptional({ description: '表单描述（多语言）' })
  @IsOptional()
  @IsObject()
  descriptionI18n?: Record<string, string>;

  // @ApiPropertyOptional({
    // description: '翻译内容（按语言分组）',
    // example: {
      // 'zh-CN': { title: '报销申请', 'fields.amount.label': '金额' },
      // 'en-US': { title: 'Expense Report', 'fields.amount.label': 'Amount' },
    // },
  // })
  @IsOptional()
  @IsObject()
  translations?: Record<string, Record<string, string>>;

  // @ApiPropertyOptional({ description: '版本变更日志' })
  @IsOptional()
  @IsString()
  changelog?: string;

  // @ApiPropertyOptional({ description: '是否设为默认版本', default: false })
  @IsOptional()
  @IsBoolean()
  setAsDefault?: boolean;
}

// ============================================
// 更新表单版本
// ============================================

export class UpdateFormVersionDto {
  // @ApiPropertyOptional({ description: '表单结构定义（JSON Schema）' })
  @IsOptional()
  @IsObject()
  schema?: any;

  // @ApiPropertyOptional({ description: 'UI 配置' })
  @IsOptional()
  @IsObject()
  uiSchema?: any;

  // @ApiPropertyOptional({ description: '验证规则' })
  @IsOptional()
  @IsObject()
  validation?: any;

  // @ApiPropertyOptional({ description: '表单名称（多语言）' })
  @IsOptional()
  @IsObject()
  nameI18n?: Record<string, string>;

  // @ApiPropertyOptional({ description: '表单描述（多语言）' })
  @IsOptional()
  @IsObject()
  descriptionI18n?: Record<string, string>;

  // @ApiPropertyOptional({ description: '版本变更日志' })
  @IsOptional()
  @IsString()
  changelog?: string;
}

// ============================================
// 发布表单版本
// ============================================

export class PublishFormVersionDto {
  // @ApiPropertyOptional({ description: '是否设为默认版本', default: false })
  @IsOptional()
  @IsBoolean()
  setAsDefault?: boolean;
}

// ============================================
// 发布表单定义
// ============================================

export class PublishFormDefinitionDto {
  // @ApiPropertyOptional({
    // description: '可选：指定一个版本号作为发布时检查的默认版本',
  // })
  @IsOptional()
  @IsInt()
  @Min(1)
  publishVersion?: number;
}

// ============================================
// 归档表单定义
// ============================================

export class ArchiveFormDefinitionDto {
  // @ApiPropertyOptional({ description: '归档原因' })
  @IsOptional()
  @IsString()
  reason?: string;
}

// ============================================
// 设置默认版本
// ============================================

export class SetDefaultVersionDto {
  // @ApiProperty({ description: '版本号' })
  @IsInt()
  @Min(1)
  version: number;
}

// ============================================
// 复制表单定义
// ============================================

export class CopyFormDefinitionDto {
  // @ApiProperty({ description: '新表单的 slug' })
  @IsString()
  newSlug: string;

  // @ApiProperty({ description: '新表单的名称（多语言）' })
  @IsObject()
  newName: Record<string, string>;

  // @ApiPropertyOptional({ description: '是否复制所有版本', default: false })
  @IsOptional()
  @IsBoolean()
  copyAllVersions?: boolean;
}
