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

export enum SortOrder {
  ASC = "ASC",
  DESC = "DESC",
}

export enum SortColumn {
  FROM_DATE = "from_date",
  TO_DATE = "to_date",
  CREATED_AT = "created_at",
  EMPLOYEE_NAME = "employee_name",
  LEAVE_TYPE = "leave_type",
}

export class LeaveRequestFiltersDto {
  @ApiProperty({
    description: "Skip number for pagination",
    example: 0,
    required: false,
  })
  @IsOptional()
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "skip",
      ":type": "integer",
    }),
  })
  skip?: number

  @ApiProperty({
    description: "Number of items to take",
    example: 10,
    required: false,
  })
  @IsOptional()
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "take",
      ":type": "integer",
    }),
  })
  take?: number

  @ApiProperty({
    description: "Page number for pagination (legacy support)",
    example: 1,
    required: false,
  })
  @IsOptional()
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "page",
      ":type": "integer",
    }),
  })
  page?: number

  @ApiProperty({
    description: "Number of items per page (legacy support)",
    example: 10,
    required: false,
  })
  @IsOptional()
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "limit",
      ":type": "integer",
    }),
  })
  limit?: number

  @ApiProperty({
    description: "Search term for employee name, leave type name, or reason",
    example: "John Doe",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "search",
      ":type": "string",
    }),
  })
  search?: string

  @ApiProperty({
    description: "Show all leave requests (for HR/Admin)",
    example: false,
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "showAll",
      ":type": "string",
    }),
  })
  showAll?: string

  @ApiProperty({
    description: "Filter by leave type ID",
    example: 1,
    required: false,
  })
  @IsOptional()
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "leave_type_id",
      ":type": "integer",
    }),
  })
  leave_type_id?: number

  @ApiProperty({
    description: "Filter by department ID",
    example: 1,
    required: false,
  })
  @IsOptional()
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "department_id",
      ":type": "integer",
    }),
  })
  department_id?: number

  @ApiProperty({
    description: "Filter by employee ID",
    example: 1,
    required: false,
  })
  @IsOptional()
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "employee_id",
      ":type": "integer",
    }),
  })
  employee_id?: number

  @ApiProperty({
    description: "Filter by status",
    example: "pending",
    enum: LeaveRequestStatus,
    required: false,
  })
  @IsOptional()
  @IsEnum(LeaveRequestStatus, {
    message: validationMessage(messageKey.field_enum_validation_error, {
      ":field": "status",
      ":values": Object.values(LeaveRequestStatus).join(", "),
    }),
  })
  status?: LeaveRequestStatus

  @ApiProperty({
    description: "Filter from date",
    example: "2025-01-01",
    required: false,
  })
  @IsOptional()
  @IsDateString(
    {},
    {
      message: validationMessage(messageKey.field_type_validation_error, {
        ":field": "from_date",
        ":type": "date",
      }),
    },
  )
  from_date?: string

  @ApiProperty({
    description: "Filter to date",
    example: "2025-12-31",
    required: false,
  })
  @IsOptional()
  @IsDateString(
    {},
    {
      message: validationMessage(messageKey.field_type_validation_error, {
        ":field": "to_date",
        ":type": "date",
      }),
    },
  )
  to_date?: string

  @ApiProperty({
    description: "Filter by company ID",
    example: 1,
    required: false,
  })
  @IsOptional()
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "company_id",
      ":type": "integer",
    }),
  })
  company_id?: number

  @ApiProperty({
    description: "Column to sort by",
    example: "from_date",
    enum: SortColumn,
    required: false,
  })
  @IsOptional()
  @IsEnum(SortColumn, {
    message: validationMessage(messageKey.field_enum_validation_error, {
      ":field": "column_name",
      ":values": Object.values(SortColumn).join(", "),
    }),
  })
  column_name?: SortColumn

  @ApiProperty({
    description: "Sort order",
    example: "DESC",
    enum: SortOrder,
    required: false,
  })
  @IsOptional()
  @IsEnum(SortOrder, {
    message: validationMessage(messageKey.field_enum_validation_error, {
      ":field": "order",
      ":values": Object.values(SortOrder).join(", "),
    }),
  })
  order?: SortOrder

  @ApiProperty({
    description: "Filter by date",
    example: "today",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "date",
      ":type": "string",
    }),
  })
  date?: string
}
