import { ApiProperty } from "@nestjs/swagger"
import {
  IsInt,
  IsOptional,
  IsString,
  IsArray,
  ValidateNested,
  IsNumber,
} from "class-validator"
import { Type } from "class-transformer"
import { messageKey } from "../../../constants/message-keys"
import { validationMessage } from "../../../utils/helpers"
import { KpiRatingDto } from "./kpi-rating.dto"

export class MisActionDto {
  @ApiProperty({
    description: "ID for update case",
    example: 1,
    required: false,
  })
  @IsOptional()
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "id",
      ":type": "integer",
    }),
  })
  id?: number

  @ApiProperty({
    description: "Month",
    example: 1,
    required: true,
  })
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "month",
      ":type": "integer",
    }),
  })
  month: number

  @ApiProperty({
    description: "Year",
    example: 2024,
    required: true,
  })
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "year",
      ":type": "integer",
    }),
  })
  year: number

  @ApiProperty({
    description: "Employee ID",
    example: 1,
    required: true,
  })
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "employee_id",
      ":type": "integer",
    }),
  })
  employee_id: number

  @ApiProperty({
    description: "Report ID",
    example: 1,
    required: true,
  })
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "report_id",
      ":type": "integer",
    }),
  })
  report_id: number

  @ApiProperty({
    description: "Business feedback",
    example: "Good performance in business tasks",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "business_feedback",
      ":type": "string",
    }),
  })
  business_feedback?: string

  @ApiProperty({
    description: "Technical feedback",
    example: "Excellent technical skills",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "technical_feedback",
      ":type": "string",
    }),
  })
  technical_feedback?: string

  @ApiProperty({
    description: "Personal feedback",
    example: "Great team player",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "personal_feedback",
      ":type": "string",
    }),
  })
  personal_feedback?: string

  @ApiProperty({
    description: "Business rating",
    example: 4,
    required: false,
  })
  @IsOptional()
  @IsNumber(
    { maxDecimalPlaces: 2 },
    {
      message: validationMessage(messageKey.field_type_validation_error, {
        ":field": "business_rating",
        ":type": "number",
      }),
    },
  )
  business_rating?: number

  @ApiProperty({
    description: "Technical rating",
    example: 5,
    required: false,
  })
  @IsOptional()
  @IsNumber(
    { maxDecimalPlaces: 2 },
    {
      message: validationMessage(messageKey.field_type_validation_error, {
        ":field": "technical_rating",
        ":type": "number",
      }),
    },
  )
  technical_rating?: number

  @ApiProperty({
    description: "Personal rating",
    example: 4,
    required: false,
  })
  @IsOptional()
  @IsNumber(
    { maxDecimalPlaces: 2 },
    {
      message: validationMessage(messageKey.field_type_validation_error, {
        ":field": "personal_rating",
        ":type": "number",
      }),
    },
  )
  personal_rating?: number

  @ApiProperty({
    description: "KPI ratings array",
    type: [KpiRatingDto],
    required: false,
  })
  @IsOptional()
  @IsArray({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "kpi_ratings",
      ":type": "array",
    }),
  })
  @ValidateNested({ each: true })
  @Type(() => KpiRatingDto)
  kpi_ratings?: KpiRatingDto[]
}
