import {
  IsString,
  IsEnum,
  IsOptional,
  IsNotEmpty,
  IsUUID,
  IsInt,
  IsNumber,
  IsArray,
  Min,
  Max,
} from 'class-validator';
import { Type } from 'class-transformer';
import { KpiAssessmentStatus } from '@prisma/client';

// ==================== Assignment DTOs ====================

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

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

  @IsNumber()
  @Min(0)
  @Max(100)
  weight: number;

  @IsString()
  @IsNotEmpty()
  name: string;

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

  @IsOptional()
  @IsString()
  baseTarget?: string;

  @IsOptional()
  @IsString()
  stretchTarget?: string;

  @IsOptional()
  @IsString()
  unit?: string;

  @IsOptional()
  @IsNumber()
  targetValue?: number;

  @IsOptional()
  @IsArray()
  dependencies?: { targetUserId: string; description?: string }[];

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

  @IsOptional()
  @IsString()
  dependencyDescription?: string;

  @IsOptional()
  @IsUUID()
  parentId?: string;
}

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

  @IsArray()
  @IsUUID('4', { each: true })
  employeeIds: string[];

  @IsArray()
  assignments: {
    weight: number;
    name?: string;
    targetValue?: number;
  }[];
}

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

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

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

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

export class UpdateAssignmentDto {
  @IsOptional()
  @IsNumber()
  @Min(0)
  @Max(100)
  weight?: number;

  @IsOptional()
  @IsNumber()
  targetValue?: number;

  @IsOptional()
  @IsString()
  name?: string;

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

  @IsOptional()
  @IsString()
  baseTarget?: string;

  @IsOptional()
  @IsString()
  stretchTarget?: string;

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

  @IsOptional()
  @IsString()
  dependencyDescription?: string;

}

// ==================== Assessment DTOs ====================

export class SelfEvaluateDto {
  @IsOptional()
  @IsNumber()
  score?: number;

  @IsOptional()
  @IsNumber()
  selfScore?: number; // 前端字段名

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

  @IsOptional()
  @IsString()
  selfComment?: string; // 前端字段名

  @IsOptional()
  @IsString()
  completionNote?: string;

  @IsOptional()
  @IsNumber()
  actualValue?: number;
}

export class ManagerEvaluateDto {
  @IsOptional()
  @IsNumber()
  score?: number;

  @IsOptional()
  @IsNumber()
  managerScore?: number; // 前端字段名

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

  @IsOptional()
  @IsString()
  managerComment?: string; // 前端字段名

}

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

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

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

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

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

// ==================== Submit / Approve / Reject DTOs ====================

export class SubmitAllKpiDto {
  @IsUUID()
  cycleId: string;
}

export class RejectAssignmentDto {
  @IsString()
  reason: string;
}

export class RejectDependencyDto {
  @IsString()
  reason: string;
}

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

export class AssignmentResponseDto {
  id: string;
  cycleId: string;
  employeeId: string;
  weight: number;
  targetValue?: number;
  assessment?: AssessmentResponseDto;
  createdAt: Date;
}

export class AssessmentResponseDto {
  id: string;
  assignmentId: string;
  status: KpiAssessmentStatus;
  selfScore?: number;
  selfComment?: string;
  selfEvaluatedAt?: Date;
  managerScore?: number;
  managerComment?: string;
  managerId?: string;
  managerEvaluatedAt?: Date;
  finalScore?: number;
}
