import {
  IsString,
  IsEnum,
  IsOptional,
  IsUUID,
  IsInt,
  IsNumber,
  IsArray,
  IsBoolean,
  IsDateString,
  ValidateNested,
  Min,
  Max,
} from 'class-validator';
import { Type } from 'class-transformer';
import { Evaluation360Status, EvaluationTaskStatus, RelationType } from '@prisma/client';

// ==================== Evaluation360 DTOs ====================

export class CreateEvaluation360Dto {
  @IsUUID()
  cycleId: string;

  @IsOptional()
  @IsUUID()
  targetId?: string;

  @IsOptional()
  @IsUUID()
  evaluateeId?: string; // 前端字段名，与 targetId 二选一

  @IsOptional()
  @IsDateString()
  deadline?: string; // 可选，默认用周期结束日期

  @IsOptional()
  @IsUUID()
  templateId?: string;

  @IsOptional()
  @IsInt()
  @Min(1)
  minEvaluators?: number;

  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => AddEvaluatorDto)
  evaluators?: AddEvaluatorDto[];

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

export class UpdateEvaluation360Dto {
  @IsOptional()
  @IsDateString()
  deadline?: string;

  @IsOptional()
  @IsUUID()
  templateId?: string;

  @IsOptional()
  @IsInt()
  @Min(1)
  minEvaluators?: number;
}

export class QueryEvaluation360Dto {
  @IsOptional()
  @IsUUID()
  cycleId?: string;

  @IsOptional()
  @IsUUID()
  evaluateeId?: string; // 前端字段名，用于按被评估人过滤

  @IsOptional()
  @IsEnum(Evaluation360Status)
  status?: Evaluation360Status;

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

  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  @Max(100)
  pageSize?: number = 20;
}

// ==================== Evaluator/Task DTOs ====================

export class AddEvaluatorDto {
  @IsUUID()
  evaluatorId: string;

  @IsOptional()
  @IsEnum(RelationType)
  relationType?: RelationType;

  @IsOptional()
  @IsString()
  relationship?: string; // 前端字段名，service 层映射到 relationType

  @IsOptional()
  @IsBoolean()
  isAnonymous?: boolean;
}

export class AddEvaluatorsDto {
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => AddEvaluatorDto)
  evaluators: AddEvaluatorDto[];
}

export class QueryTaskDto {
  @IsOptional()
  @IsUUID()
  evaluationId?: string;

  @IsOptional()
  @IsUUID()
  evaluatorId?: string;

  @IsOptional()
  @IsEnum(EvaluationTaskStatus)
  status?: EvaluationTaskStatus;

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

  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  @Max(100)
  pageSize?: number = 20;
}

// ==================== Feedback/Response DTOs ====================

export class DimensionScoreDto {
  @IsString()
  dimension: string;

  @IsNumber()
  score: number;

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

export class SubmitFeedbackDto {
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => DimensionScoreDto)
  responses: DimensionScoreDto[];

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

// ==================== Response DTOs ====================

export class Evaluation360ResponseDto {
  id: string;
  cycleId: string;
  targetId: string;
  status: Evaluation360Status;
  templateId?: string;
  deadline: Date;
  minEvaluators?: number;
  createdBy: string;
  createdAt: Date;
  updatedAt: Date;
  tasks?: TaskResponseDto[];
}

export class TaskResponseDto {
  id: string;
  evaluationId: string;
  evaluatorId: string;
  relationType: RelationType;
  status: EvaluationTaskStatus;
  isAnonymous: boolean;
  submittedAt?: Date;
  createdAt: Date;
}

export class EvaluationResultDto {
  evaluationId: string;
  targetId: string;
  overallScore: number;
  dimensionScores: {
    dimension: string;
    avgScore: number;
    responses: number;
  }[];
  relationBreakdown: {
    relationType: RelationType;
    avgScore: number;
    count: number;
  }[];
  completedTasks: number;
  totalTasks: number;
}
