import {
  IsString,
  IsEnum,
  IsDateString,
  IsOptional,
  IsUUID,
  IsInt,
  IsBoolean,
  Min,
  Max,
} from 'class-validator';
import { Type } from 'class-transformer';
import { CycleStatus, CycleType } from '@prisma/client';

/**
 * 创建周期 DTO
 */
export class CreateCycleDto {
  @IsString()
  name: string;

  @IsEnum(CycleType)
  type: CycleType;

  @IsDateString()
  startDate: string;

  @IsDateString()
  endDate: string;

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

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

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

/**
 * 更新周期 DTO
 */
export class UpdateCycleDto {
  @IsOptional()
  @IsString()
  name?: string;

  @IsOptional()
  @IsDateString()
  startDate?: string;

  @IsOptional()
  @IsDateString()
  endDate?: string;

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

/**
 * 查询周期 DTO
 */
export class QueryCycleDto {
  @IsOptional()
  @IsEnum(CycleType)
  type?: CycleType;

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

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

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

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

/**
 * 周期响应 DTO
 */
export class CycleResponseDto {
  id: string;
  name: string;
  type: CycleType;
  status: CycleStatus;
  startDate: Date;
  endDate: Date;
  organizationId: string;
  parentCycleId?: string;
  gradeConfigId?: string;
  resultsPublishedAt?: Date;
  resultsPublishedBy?: string;
  createdBy: string;
  createdAt: Date;
  updatedAt: Date;
}

/**
 * 周期统计响应 DTO
 */
export class CycleStatisticsDto {
  cycleId: string;
  totalEmployees: number;
  kpiStats: {
    total: number;
    evaluated: number;
    avgScore: number;
  };
  e360Stats: {
    total: number;
    completed: number;
    avgScore: number;
  };
}
