/**
 * Webhook 相关 DTOs
 */

import {
  IsString,
  IsOptional,
  IsBoolean,
  IsArray,
  IsUrl,
  IsInt,
  Min,
  Max,
  IsObject,
  IsNotEmpty,
} from 'class-validator';
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Transform, Type } from 'class-transformer';

/**
 * Webhook 事件类型
 */
export enum WebhookEventType {
  // 快照事件
  SNAPSHOT_SUBMITTED = 'form.snapshot.submitted',
  SNAPSHOT_APPROVED = 'form.snapshot.approved',
  SNAPSHOT_REJECTED = 'form.snapshot.rejected',
  SNAPSHOT_PUBLISHED = 'form.snapshot.published',
  // 实例事件
  INSTANCE_CREATED = 'form.instance.created',
  INSTANCE_SUBMITTED = 'form.instance.submitted',
  INSTANCE_APPROVED = 'form.instance.approved',
  INSTANCE_REJECTED = 'form.instance.rejected',
  INSTANCE_WITHDRAWN = 'form.instance.withdrawn',
  // 定义事件
  DEFINITION_CREATED = 'form.definition.created',
  DEFINITION_UPDATED = 'form.definition.updated',
  DEFINITION_ARCHIVED = 'form.definition.archived',
}

/**
 * 创建 Webhook DTO
 */
export class CreateWebhookDto {
  @ApiProperty({
    description: 'Webhook 名称',
    example: '审批通知',
  })
  @IsNotEmpty({ message: '名称不能为空' })
  @IsString()
  name: string;

  @ApiPropertyOptional({
    description: '描述',
    example: '表单发布后通知第三方系统',
  })
  @IsOptional()
  @IsString()
  description?: string;

  @ApiProperty({
    description: '目标 URL',
    example: 'https://api.example.com/webhooks/form',
  })
  @IsNotEmpty()
  @IsUrl()
  url: string;

  @ApiProperty({
    description: '订阅的事件类型',
    example: ['form.snapshot.published', 'form.instance.created'],
    type: [String],
  })
  @IsArray()
  @IsString({ each: true })
  events: string[];

  @ApiPropertyOptional({
    description: '自定义请求头',
    example: { 'X-Custom-Header': 'value' },
  })
  @IsOptional()
  @IsObject()
  headers?: Record<string, string>;

  @ApiPropertyOptional({
    description: '最大重试次数',
    default: 3,
    minimum: 0,
    maximum: 10,
  })
  @IsOptional()
  @IsInt()
  @Min(0)
  @Max(10)
  maxRetries?: number;

  @ApiPropertyOptional({
    description: '超时时间（毫秒）',
    default: 5000,
    minimum: 1000,
    maximum: 30000,
  })
  @IsOptional()
  @IsInt()
  @Min(1000)
  @Max(30000)
  timeoutMs?: number;
}

/**
 * 更新 Webhook DTO
 */
export class UpdateWebhookDto {
  @ApiPropertyOptional({
    description: 'Webhook 名称',
  })
  @IsOptional()
  @IsString()
  name?: string;

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

  @ApiPropertyOptional({
    description: '目标 URL',
  })
  @IsOptional()
  @IsUrl()
  url?: string;

  @ApiPropertyOptional({
    description: '订阅的事件类型',
    type: [String],
  })
  @IsOptional()
  @IsArray()
  @IsString({ each: true })
  events?: string[];

  @ApiPropertyOptional({
    description: '是否启用',
  })
  @IsOptional()
  @IsBoolean()
  enabled?: boolean;

  @ApiPropertyOptional({
    description: '自定义请求头',
  })
  @IsOptional()
  @IsObject()
  headers?: Record<string, string>;

  @ApiPropertyOptional({
    description: '最大重试次数',
  })
  @IsOptional()
  @IsInt()
  @Min(0)
  @Max(10)
  maxRetries?: number;

  @ApiPropertyOptional({
    description: '超时时间（毫秒）',
  })
  @IsOptional()
  @IsInt()
  @Min(1000)
  @Max(30000)
  timeoutMs?: number;
}

/**
 * 测试 Webhook DTO
 */
export class TestWebhookDto {
  @ApiPropertyOptional({
    description: '测试事件类型',
    example: 'form.snapshot.published',
  })
  @IsOptional()
  @IsString()
  eventType?: string;

  @ApiPropertyOptional({
    description: '测试数据',
  })
  @IsOptional()
  @IsObject()
  testPayload?: Record<string, any>;
}

/**
 * Webhook 响应
 */
export class WebhookResponse {
  @ApiProperty() id: string;
  @ApiPropertyOptional() organizationId?: string;
  @ApiProperty() name: string;
  @ApiPropertyOptional() description?: string;
  @ApiProperty() url: string;
  @ApiProperty() events: string[];
  @ApiProperty() enabled: boolean;
  @ApiProperty() maxRetries: number;
  @ApiProperty() timeoutMs: number;
  @ApiPropertyOptional() headers?: Record<string, string>;
  @ApiProperty() createdAt: string;
  @ApiProperty() updatedAt: string;
}

/**
 * Webhook 日志响应
 */
export class WebhookLogResponse {
  @ApiProperty() id: string;
  @ApiProperty() webhookId: string;
  @ApiProperty() eventType: string;
  @ApiProperty() payload: any;
  @ApiPropertyOptional() statusCode?: number;
  @ApiPropertyOptional() response?: string;
  @ApiProperty() success: boolean;
  @ApiPropertyOptional() error?: string;
  @ApiProperty() retryCount: number;
  @ApiPropertyOptional() duration?: number;
  @ApiProperty() createdAt: string;
}

/**
 * Webhook 日志查询 DTO
 */
export class QueryWebhookLogsDto {
  @ApiPropertyOptional({
    description: '页码',
    default: 1,
  })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  page?: number = 1;

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

  @ApiPropertyOptional({
    description: '事件类型筛选',
  })
  @IsOptional()
  @IsString()
  eventType?: string;

  @ApiPropertyOptional({
    description: '是否成功',
  })
  @IsOptional()
  @Transform(({ value }) => {
    if (value === 'true' || value === true) return true;
    if (value === 'false' || value === false) return false;
    return value;
  })
  @IsBoolean()
  success?: boolean;
}
