import { ApiProperty } from "@nestjs/swagger"
import {
  IsNotEmpty,
  IsOptional,
  IsInt,
  IsString,
  IsDateString,
  IsNumber,
  Min,
  IsEnum,
} from "class-validator"
import { validationMessage } from "../../../utils/helpers"
import { messageKey } from "../../../constants/message-keys"
import { LeaveDayType } from "../entities/leave-request.entity"

export class CreateLeaveRequestDto {
  @ApiProperty({
    description: "Leave Type ID (Main Leave Type)",
    example: 1,
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "leave_type_id",
    }),
  })
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "leave_type_id",
      ":type": "integer",
    }),
  })
  leave_type_id: number

  @ApiProperty({
    description: "Sub Leave Type ID (Optional)",
    example: 3,
    required: false,
  })
  @IsOptional()
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "sub_leave_type_id",
      ":type": "integer",
    }),
  })
  sub_leave_type_id?: number

  @ApiProperty({
    description: "From Date",
    example: "2025-01-15",
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "from_date",
    }),
  })
  @IsDateString(
    {},
    {
      message: validationMessage(messageKey.field_type_validation_error, {
        ":field": "from_date",
        ":type": "date",
      }),
    },
  )
  from_date: string

  @ApiProperty({
    description: "To Date",
    example: "2025-01-17",
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "to_date",
    }),
  })
  @IsDateString(
    {},
    {
      message: validationMessage(messageKey.field_type_validation_error, {
        ":field": "to_date",
        ":type": "date",
      }),
    },
  )
  to_date: string

  @ApiProperty({
    description: "Duration in Days (supports half-day)",
    example: 2.5,
    required: false,
  })
  @IsOptional()
  @IsNumber(
    {},
    {
      message: validationMessage(messageKey.field_type_validation_error, {
        ":field": "duration_days",
        ":type": "number",
      }),
    },
  )
  @Min(0.5, {
    message: validationMessage(messageKey.field_min_validation_error, {
      ":field": "duration_days",
      ":min": "0.5",
    }),
  })
  duration_days?: number

  @ApiProperty({
    description: "Reason for Leave",
    example: "Medical appointment",
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "reason",
    }),
  })
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "reason",
      ":type": "string",
    }),
  })
  reason: string

  @ApiProperty({
    description: "Leave Day Type",
    example: LeaveDayType.FULL,
    enum: LeaveDayType,
    required: false,
  })
  @IsOptional()
  @IsEnum(LeaveDayType, {
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "leave_day_type",
      ":type": "enum (FULL, FIRST_HALF, SECOND_HALF)",
    }),
  })
  leave_day_type?: LeaveDayType
}
