/**
 * 表单实例 DTOs
 * 完全符合 API 文档规范
 */

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

// ============================================
// 创建表单实例（草稿）
// ============================================

export class CreateFormInstanceDto {
  // @ApiProperty({
    // description: '表单标识（支持 id/key/slug/alias）',
    // example: 'expense-reimbursement',
  // })
  @IsString()
  formIdentifier: string;

  // @ApiPropertyOptional({
    // description: '表单版本号（不指定则使用默认版本）',
    // minimum: 1,
  // })
  @IsOptional()
  @IsInt()
  @Min(1)
  version?: number;

  // @ApiProperty({ description: '表单数据（JSON）', example: { amount: 1000 } })
  @IsObject()
  data: Record<string, any>;
}

// ============================================
// 更新表单实例
// ============================================

export class UpdateFormInstanceDto {
  // @ApiProperty({ description: '表单数据（JSON）' })
  @IsObject()
  data: Record<string, any>;
}

// ============================================
// 提交表单实例
// ============================================

export class SubmitFormInstanceDto {
  // @ApiProperty({ description: '表单数据（JSON）' })
  @IsObject()
  data: Record<string, any>;

  // @ApiPropertyOptional({
    // description: '是否提交审批（如果表单需要审批）',
    // default: true,
  // })
  @IsOptional()
  @IsBoolean()
  submitForApproval?: boolean;

  // @ApiPropertyOptional({ description: '提交意见' })
  @IsOptional()
  @IsString()
  comment?: string;
}

// ============================================
// 查询我的表单实例
// ============================================

export class QueryMyFormInstancesDto {
  // @ApiPropertyOptional({ description: '表单 key' })
  @IsOptional()
  @IsString()
  formKey?: string;

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

  // @ApiPropertyOptional({
    // description: '开始日期',
    // example: '2025-01-01',
  // })
  @IsOptional()
  @IsDateString()
  startDate?: string;

  // @ApiPropertyOptional({
    // description: '结束日期',
    // example: '2025-12-31',
  // })
  @IsOptional()
  @IsDateString()
  endDate?: 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 QueryAllFormInstancesDto {
  // @ApiPropertyOptional({ description: '表单 key' })
  @IsOptional()
  @IsString()
  formKey?: string;

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

  // @ApiPropertyOptional({ description: '创建人 ID（UUID）' })
  @IsOptional()
  @IsUUID()
  createdBy?: string;

  // @ApiPropertyOptional({ description: '开始日期' })
  @IsOptional()
  @IsDateString()
  startDate?: string;

  // @ApiPropertyOptional({ description: '结束日期' })
  @IsOptional()
  @IsDateString()
  endDate?: string;

  // @ApiPropertyOptional({
    // description: '是否包含已删除',
    // default: false,
  // })
  @IsOptional()
  @Type(() => Boolean)
  @IsBoolean()
  includeDeleted?: boolean;

  // @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 BatchUpdateStatusDto {
  // @ApiProperty({
    // description: '实例 ID 列表',
    // example: ['id-001', 'id-002', 'id-003'],
    // type: [String],
  // })
  @IsArray()
  @IsUUID('4', { each: true })
  instanceIds: string[];

  // @ApiProperty({
    // description: '新状态',
    // enum: FormInstanceStatus,
  // })
  @IsEnum(FormInstanceStatus)
  status: FormInstanceStatus;

  // @ApiPropertyOptional({
    // description: '备注',
    // example: '批量审批通过',
  // })
  @IsOptional()
  @IsString()
  comment?: string;
}

// ============================================
// 导出表单实例数据（管理员）
// ============================================

export class ExportFormInstancesDto {
  // @ApiProperty({ description: '表单 key' })
  @IsString()
  formKey: string;

  // @ApiPropertyOptional({
    // description: '格式',
    // enum: ['excel', 'csv'],
    // default: 'excel',
  // })
  @IsOptional()
  @IsString()
  format?: 'excel' | 'csv';

  // @ApiPropertyOptional({ description: '开始日期' })
  @IsOptional()
  @IsDateString()
  startDate?: string;

  // @ApiPropertyOptional({ description: '结束日期' })
  @IsOptional()
  @IsDateString()
  endDate?: string;

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

// ============================================
// 获取表单实例统计（管理员）
// ============================================

export class GetFormInstanceStatsDto {
  // @ApiProperty({ description: '表单 key' })
  @IsString()
  formKey: string;

  // @ApiPropertyOptional({
    // description: '分组维度',
    // enum: ['day', 'week', 'month', 'user'],
  // })
  @IsOptional()
  @IsString()
  groupBy?: 'day' | 'week' | 'month' | 'user';

  // @ApiPropertyOptional({ description: '开始日期' })
  @IsOptional()
  @IsDateString()
  startDate?: string;

  // @ApiPropertyOptional({ description: '结束日期' })
  @IsOptional()
  @IsDateString()
  endDate?: string;
}

// ============================================
// 取消表单实例
// ============================================

export class CancelFormInstanceDto {
  // @ApiProperty({ description: '取消原因', example: '填写有误，需要重新提交' })
  @IsString()
  reason: string;
}
