import { Type } from 'class-transformer';
import {
  ArrayMinSize,
  IsArray,
  IsBoolean,
  IsDateString,
  IsEnum,
  IsIn,
  IsInt,
  IsOptional,
  IsString,
  IsUUID,
  MaxLength,
  Min,
} from 'class-validator';
import { MeetingAttachmentCategory, UploadTaskStatus } from '@prisma/client';

/**
 * 议程能力 v1.0 DTO
 *
 * - title / code / description 加 MaxLength 与 schema 对齐（避免数据库层面 22001）
 * - reorder DTO 单独抽出
 * - my-upload-tasks 的 cursor 编码 = base64({ assignedAt, id })，DTO 仅做 string 校验
 */

export class CreateAgendaSectionDto {
  @IsString()
  @MaxLength(200)
  title!: string;

  @IsOptional()
  @IsInt()
  @Min(0)
  order?: number;

  /** 段级列模式：[] = 单栏；["FFAI/EAI-EV", "EAI-Robotics"] = 双栏；自由命名 */
  @IsOptional()
  @IsArray()
  @IsString({ each: true })
  @MaxLength(100, { each: true })
  columnLabels?: string[];
}

export class UpdateAgendaSectionDto {
  @IsOptional()
  @IsString()
  @MaxLength(200)
  title?: string;

  @IsOptional()
  @IsInt()
  @Min(0)
  order?: number;

  @IsOptional()
  @IsArray()
  @IsString({ each: true })
  @MaxLength(100, { each: true })
  columnLabels?: string[];
}

export class ReorderDto {
  @IsArray()
  @ArrayMinSize(1)
  @IsUUID('4', { each: true })
  ids!: string[];
}

export class CreateAgendaItemDto {
  @IsString()
  @MaxLength(200)
  title!: string;

  @IsOptional()
  @IsString()
  @MaxLength(2000)
  description?: string;

  @IsOptional()
  @IsString()
  @MaxLength(64)
  code?: string;

  @IsOptional()
  @IsInt()
  @Min(0)
  timeMinutes?: number;

  @IsOptional()
  @IsUUID('4')
  presenterUserId?: string;

  /** 多栏段使用：与所在段 columnLabels 等长；单栏段忽略 */
  @IsOptional()
  @IsArray()
  @IsString({ each: true })
  @MaxLength(2000, { each: true })
  columnDescriptions?: string[];

  @IsOptional()
  @IsInt()
  @Min(0)
  order?: number;
}

export class UpdateAgendaItemDto {
  @IsOptional()
  @IsString()
  @MaxLength(200)
  title?: string;

  @IsOptional()
  @IsString()
  @MaxLength(2000)
  description?: string;

  @IsOptional()
  @IsString()
  @MaxLength(64)
  code?: string;

  @IsOptional()
  @IsInt()
  @Min(0)
  timeMinutes?: number;

  // 允许显式置 null 取消主讲人；null 不走 IsUUID 校验
  @IsOptional()
  presenterUserId?: string | null;

  @IsOptional()
  @IsArray()
  @IsString({ each: true })
  @MaxLength(2000, { each: true })
  columnDescriptions?: string[];

  @IsOptional()
  @IsInt()
  @Min(0)
  order?: number;
}

export class AssignUploadTaskDto {
  @IsArray()
  @ArrayMinSize(1)
  @IsUUID('4', { each: true })
  assigneeUserIds!: string[];

  @IsOptional()
  @IsDateString()
  dueAt?: string;
}

export class UpdateUploadTaskDto {
  /** 仅允许 CANCELLED；其它值由 service 层显式拒绝。 */
  @IsOptional()
  @IsIn(['CANCELLED'])
  status?: 'CANCELLED';

  @IsOptional()
  @IsDateString()
  dueAt?: string | null;
}

export class QueryMyTasksDto {
  @IsOptional()
  @IsEnum(UploadTaskStatus)
  status?: UploadTaskStatus;

  @IsOptional()
  @IsIn(['dueAt_asc', 'assignedAt_desc'])
  sort?: 'dueAt_asc' | 'assignedAt_desc';

  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  limit?: number;

  @IsOptional()
  @IsString()
  cursor?: string;
}

export class QueryAgendaItemUploadTasksDto {
  @IsOptional()
  @IsEnum(UploadTaskStatus)
  status?: UploadTaskStatus;
}

export class QueryMeetingAttachmentsDto {
  @IsOptional()
  @IsEnum(MeetingAttachmentCategory)
  category?: MeetingAttachmentCategory;
}

export class UploadMeetingAttachmentBodyDto {
  @IsOptional()
  @IsEnum(MeetingAttachmentCategory)
  category?: MeetingAttachmentCategory;
}

/** Internal helper：reorder 端点的 body 兼容 `{ ids: [] }`。 */
export interface ReorderBody {
  ids: string[];
}

/** 仅用于响应/编程内联：保留 boolean 解析空间（reserved，目前未直接 wire 起来）。 */
export class AgendaReservedFlagsDto {
  @IsOptional()
  @IsBoolean()
  agendaModifiedAfterMeetingEnd?: boolean;
}
