/**
 * 表单设计相关 DTOs
 */

import {
  IsString,
  IsOptional,
  IsObject,
  IsNotEmpty,
  IsArray,
  ValidateNested,
} from 'class-validator';
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Type } from 'class-transformer';

/**
 * 表单 Schema DTO
 */
export class FormSchemaDto {
  @ApiProperty({
    description: 'JSON Schema 类型',
    example: 'object',
  })
  @IsString()
  type: string;

  @ApiPropertyOptional({
    description: '字段属性定义',
  })
  @IsOptional()
  @IsObject()
  properties?: Record<string, any>;

  @ApiPropertyOptional({
    description: '必填字段列表',
  })
  @IsOptional()
  @IsArray()
  required?: string[];
}

/**
 * UI Schema DTO
 */
export class UiSchemaDto {
  @ApiPropertyOptional({
    description: '字段排序',
  })
  @IsOptional()
  @IsArray()
  'ui:order'?: string[];

  [key: string]: any;
}

/**
 * 表单设计 DTO
 */
export class FormDesignDto {
  @ApiProperty({
    description: '表单 JSON Schema',
  })
  @IsObject()
  schema: FormSchemaDto;

  @ApiPropertyOptional({
    description: 'UI Schema 配置',
  })
  @IsOptional()
  @IsObject()
  uiSchema?: UiSchemaDto;
}

/**
 * 流程节点配置
 */
export class ProcessNodeConfigDto {
  @ApiPropertyOptional({
    description: '审批人类型',
    example: 'FIXED_USER',
  })
  @IsOptional()
  @IsString()
  approverType?: string;

  @ApiPropertyOptional({
    description: '审批人 ID 列表',
    example: ['user-id-1', 'user-id-2'],
  })
  @IsOptional()
  @IsArray()
  approvers?: string[];

  @ApiPropertyOptional({
    description: '审批人完整信息（用于前端显示）',
  })
  @IsOptional()
  @IsArray()
  approverDetails?: Array<{
    id: string;
    displayName: string;
    username?: string;
    email?: string;
    avatar?: string;
    department?: string;
  }>;

  @ApiPropertyOptional({
    description: '审批模式',
    example: 'OR',
  })
  @IsOptional()
  @IsString()
  approvalMode?: string;

  @ApiPropertyOptional({
    description: '连续上级审批配置',
  })
  @IsOptional()
  @IsObject()
  chainConfig?: {
    stopCondition?: string;
    includeTerminator?: boolean;
    skipSelf?: boolean;
    autoApprove?: string;
    maxLevels?: number;
  };

  @ApiPropertyOptional({
    description: '可编辑字段',
  })
  @IsOptional()
  @IsArray()
  editableFields?: string[];

  @ApiPropertyOptional({
    description: '必填字段',
  })
  @IsOptional()
  @IsArray()
  requiredFields?: string[];

  @ApiPropertyOptional({
    description: '隐藏字段',
  })
  @IsOptional()
  @IsArray()
  hiddenFields?: string[];

  @ApiPropertyOptional({
    description: '超时配置',
  })
  @IsOptional()
  @IsObject()
  timeout?: {
    hours: number;
    remindBeforeHours?: number;
    action?: string;
  };

  @ApiPropertyOptional({
    description: '条件表达式',
  })
  @IsOptional()
  @IsString()
  condition?: string;

  @ApiPropertyOptional({
    description: '条件标签',
  })
  @IsOptional()
  @IsString()
  conditionLabel?: string;

  @ApiPropertyOptional({
    description: '允许的操作',
  })
  @IsOptional()
  @IsArray()
  allowedActions?: string[];
}

/**
 * 流程节点 DTO
 */
export class ProcessNodeDto {
  @ApiProperty({
    description: '节点 ID',
    example: 'start',
  })
  @IsNotEmpty()
  @IsString()
  id: string;

  @ApiProperty({
    description: '节点类型',
    example: 'START',
  })
  @IsNotEmpty()
  @IsString()
  type: string;

  @ApiProperty({
    description: '节点名称',
    example: '开始',
  })
  @IsNotEmpty()
  @IsString()
  name: string;

  @ApiPropertyOptional({
    description: '节点配置',
  })
  @IsOptional()
  @IsObject()
  config?: ProcessNodeConfigDto;
}

/**
 * 流程边 DTO
 */
export class ProcessEdgeDto {
  @ApiProperty({
    description: '源节点 ID',
  })
  @IsNotEmpty()
  @IsString()
  source: string;

  @ApiProperty({
    description: '目标节点 ID',
  })
  @IsNotEmpty()
  @IsString()
  target: string;

  @ApiPropertyOptional({
    description: '条件表达式',
  })
  @IsOptional()
  @IsString()
  condition?: string;
}

/**
 * 流程设计 DTO
 */
export class ProcessDesignDto {
  @ApiProperty({
    description: '流程节点列表',
    type: [ProcessNodeDto],
  })
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => ProcessNodeDto)
  nodes: ProcessNodeDto[];

  @ApiProperty({
    description: '流程边列表',
    type: [ProcessEdgeDto],
  })
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => ProcessEdgeDto)
  edges: ProcessEdgeDto[];
}

/**
 * 保存全部设计 DTO
 */
export class SaveDesignDto {
  @ApiProperty({
    description: '表单设计',
  })
  @IsObject()
  @ValidateNested()
  @Type(() => FormDesignDto)
  formDesign: FormDesignDto;

  @ApiProperty({
    description: '流程设计',
  })
  @IsObject()
  @ValidateNested()
  @Type(() => ProcessDesignDto)
  processDesign: ProcessDesignDto;
}

/**
 * 保存表单设计 DTO
 */
export class SaveFormDesignDto {
  @ApiProperty({
    description: '表单 JSON Schema',
  })
  @IsObject()
  schema: FormSchemaDto;

  @ApiPropertyOptional({
    description: 'UI Schema 配置',
  })
  @IsOptional()
  @IsObject()
  uiSchema?: UiSchemaDto;
}

/**
 * 保存流程设计 DTO
 */
export class SaveProcessDesignDto {
  @ApiProperty({
    description: '流程节点列表',
    type: [ProcessNodeDto],
  })
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => ProcessNodeDto)
  nodes: ProcessNodeDto[];

  @ApiProperty({
    description: '流程边列表',
    type: [ProcessEdgeDto],
  })
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => ProcessEdgeDto)
  edges: ProcessEdgeDto[];
}

/**
 * 设计数据响应
 */
export class DesignDataResponse {
  @ApiProperty() formDefinition: {
    id: string;
    key: string;
    name: string;
  };
  @ApiProperty() formVersion: {
    id: string;
    version: number;
    status: string;
    schema: any;
    uiSchema?: any;
  };
  @ApiProperty() processVersion: {
    id: string;
    version: number;
    status: string;
    model: {
      nodes: ProcessNodeDto[];
      edges: ProcessEdgeDto[];
    };
  };
}

/**
 * 保存设计响应
 */
export class SaveDesignResponse {
  @ApiProperty() formVersionId: string;
  @ApiProperty() processVersionId: string;
  @ApiProperty() savedAt: string;
}
