/**
 * 查询相关 DTOs
 */

import {
  IsString,
  IsOptional,
  IsInt,
  IsEnum,
  IsBoolean,
  IsUUID,
  Min,
  Max,
} from 'class-validator';
import { ApiPropertyOptional } from '@nestjs/swagger';
import { Type } from 'class-transformer';

/**
 * 表单定义状态（与 Prisma FormStatus 枚举一致）
 * 
 * - DRAFT: 草稿，开发中，业务不可见
 * - PUBLISHED: 已发布，业务可选用
 * - DISABLED: 已禁用，暂停使用，不再接受新申请
 * - ARCHIVED: 已归档，业务不可选用（历史数据保留）
 */
export enum FormDefinitionStatus {
  DRAFT = 'DRAFT',
  PUBLISHED = 'PUBLISHED',
  DISABLED = 'DISABLED',
  ARCHIVED = 'ARCHIVED',
}

/**
 * 表单定义查询 DTO
 */
export class QueryFormDefinitionsDto {
  @ApiPropertyOptional({
    description: '页码',
    default: 1,
    minimum: 1,
  })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  page?: number = 1;

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

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

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

  @ApiPropertyOptional({
    description: '关键字搜索（名称/标识）',
  })
  @IsOptional()
  @IsString()
  keyword?: string;

  @ApiPropertyOptional({
    description: '组织 ID 筛选（只显示该组织的表单）',
  })
  @IsOptional()
  @IsUUID('4', { message: '组织 ID 格式不正确' })
  organizationId?: string;

  @ApiPropertyOptional({
    description: '用于使用表单（不应用创建者权限过滤）',
    default: false,
  })
  @IsOptional()
  @Type(() => Boolean)
  forUse?: boolean;
}

/**
 * 版本对比查询 DTO
 */
export class VersionDiffQueryDto {
  @ApiPropertyOptional({
    description: '源版本号（较旧版本）',
    minimum: 1,
  })
  @Type(() => Number)
  @IsInt()
  @Min(1)
  from: number;

  @ApiPropertyOptional({
    description: '目标版本号（较新版本）',
    minimum: 1,
  })
  @Type(() => Number)
  @IsInt()
  @Min(1)
  to: number;
}

/**
 * 分页响应
 */
export class PaginatedResponse<T> {
  items: T[];
  total: number;
  page: number;
  limit: number;
  totalPages: number;
  hasNext: boolean;
  hasPrev: boolean;
}

/**
 * 版本差异变更类型
 */
export enum ChangeType {
  ADDED = 'added',
  REMOVED = 'removed',
  MODIFIED = 'modified',
}

/**
 * 字段变更详情
 */
export class FieldChange {
  fieldKey: string;
  attribute: string;
  changeType: ChangeType;
  oldValue?: any;
  newValue?: any;
  path: string;
}

/**
 * 节点变更详情
 */
export class NodeChange {
  nodeId: string;
  changeType: ChangeType;
  oldValue?: any;
  newValue?: any;
}

/**
 * 边变更详情
 */
export class EdgeChange {
  source: string;
  target: string;
  changeType: ChangeType;
  oldValue?: any;
  newValue?: any;
}

/**
 * 版本差异响应
 */
export class VersionDiffResponse {
  from: {
    version: number;
    versionName?: string;
    createdAt: string;
  };
  to: {
    version: number;
    versionName?: string;
    createdAt: string;
  };
  schema: {
    added: FieldChange[];
    removed: FieldChange[];
    modified: FieldChange[];
  };
  uiSchema: {
    added: any[];
    removed: any[];
    modified: any[];
  };
  process: {
    nodes: {
      added: NodeChange[];
      removed: NodeChange[];
      modified: NodeChange[];
    };
    edges: {
      added: EdgeChange[];
      removed: EdgeChange[];
      modified: EdgeChange[];
    };
  };
}
