/**
 * 表单定义相关 DTOs
 */

import {
  IsString,
  IsOptional,
  IsBoolean,
  IsNotEmpty,
  Matches,
  MaxLength,
  MinLength,
  IsUUID,
} from 'class-validator';
import { Transform } from 'class-transformer';
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';

/**
 * 创建表单定义 DTO
 */
export class CreateFormDefinitionDto {
  @ApiPropertyOptional({
    description: '模板 ID（从模板创建时使用）',
    example: 'tpl-001',
  })
  @IsOptional()
  @IsString()
  templateId?: string;

  @ApiProperty({
    description: '表单标识（唯一，仅字母/数字/下划线）',
    example: 'expense_claim',
  })
  @IsNotEmpty({ message: '表单标识不能为空' })
  @IsString()
  @MinLength(2, { message: '表单标识至少2个字符' })
  @MaxLength(50, { message: '表单标识最多50个字符' })
  @Matches(/^[a-zA-Z][a-zA-Z0-9_]*$/, {
    message: '表单标识只能包含字母、数字和下划线，且必须以字母开头',
  })
  key: string;

  @ApiProperty({
    description: '表单名称',
    example: '报销申请',
  })
  @IsNotEmpty({ message: '表单名称不能为空' })
  @IsString()
  @MaxLength(100, { message: '表单名称最多100个字符' })
  name: string;

  @ApiPropertyOptional({
    description: '表单描述',
    example: '员工报销申请表单',
  })
  @IsOptional()
  @IsString()
  @MaxLength(500, { message: '表单描述最多500个字符' })
  description?: string;

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

  @ApiPropertyOptional({
    description: '归属组织 ID（顶层部门），null 表示平台级通用表单',
    example: 'uuid-of-organization',
  })
  @IsOptional()
  @IsUUID('4', { message: '组织 ID 格式不正确' })
  @Transform(({ value }) => value === '' || value === null ? undefined : value)
  organizationId?: string;

  @ApiPropertyOptional({
    description: '是否需要审批流程',
    default: true,
  })
  @IsOptional()
  @IsBoolean()
  requiresApproval?: boolean = true;
}

/**
 * 更新表单定义 DTO
 */
export class UpdateFormDefinitionDto {
  @ApiPropertyOptional({
    description: '表单名称',
    example: '报销申请',
  })
  @IsOptional()
  @IsString()
  @MaxLength(100)
  name?: string;

  @ApiPropertyOptional({
    description: '表单描述',
  })
  @IsOptional()
  @IsString()
  @MaxLength(500)
  description?: string;

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

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

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

// ============================================
// 响应类型（必须先定义子类型，再定义父类型）
// ============================================

/**
 * 流程版本简要信息
 */
export class ProcessVersionBrief {
  @ApiProperty() id: string;
  @ApiProperty() version: number;
  @ApiPropertyOptional() versionName?: string;
  @ApiProperty() status: string;
}

/**
 * 流程定义简要信息
 */
export class ProcessDefinitionBrief {
  @ApiProperty() id: string;
  @ApiProperty() key: string;
  @ApiProperty({ type: () => ProcessVersionBrief }) 
  processVersion: ProcessVersionBrief;
}

/**
 * 表单版本简要信息
 */
export class FormVersionBrief {
  @ApiProperty() id: string;
  @ApiProperty() version: number;
  @ApiPropertyOptional() versionName?: string;
  @ApiProperty() status: string;
}

/**
 * 表单定义响应
 */
export class FormDefinitionResponse {
  @ApiProperty() id: string;
  @ApiPropertyOptional() organizationId?: string;
  @ApiProperty() key: string;
  @ApiProperty() name: string;
  @ApiPropertyOptional() description?: string;
  @ApiPropertyOptional() category?: string;
  @ApiProperty() status: string;
  @ApiPropertyOptional() templateId?: string;
  @ApiProperty({ type: () => FormVersionBrief }) 
  formVersion: FormVersionBrief;
  @ApiProperty({ type: () => ProcessDefinitionBrief }) 
  processDefinition: ProcessDefinitionBrief;
  @ApiProperty() createdAt: string;
  @ApiProperty() createdBy: string;
}

/**
 * 表单定义列表项
 */
export class FormDefinitionListItem {
  @ApiProperty() id: string;
  @ApiPropertyOptional() organizationId?: string;
  @ApiProperty() key: string;
  @ApiProperty() name: string;
  @ApiPropertyOptional() description?: string;
  @ApiPropertyOptional() category?: string;
  @ApiProperty() status: string;
  @ApiProperty() requiresApproval: boolean;
  @ApiPropertyOptional() approvalProcessKey?: string;
  @ApiPropertyOptional() activeSnapshotId?: string;
  @ApiProperty() currentVersion: number;
  @ApiProperty() createdAt: string;
  @ApiProperty() updatedAt: string;
  @ApiProperty() createdBy: string;
}
