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

export class ProjectFiltersDto {
  @ApiProperty({
    description: "Page number for pagination",
    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",
    example: 10,
    required: false,
  })
  @IsOptional()
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "limit",
      ":type": "integer",
    }),
  })
  limit?: number

  @ApiProperty({
    description: "Search term for project name",
    example: "Website",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "search",
      ":type": "string",
    }),
  })
  search?: string

  @ApiProperty({
    description: "Filter by project status",
    example: "Planning",
    enum: ["Planning", "In Progress"],
    required: false,
  })
  @IsOptional()
  @IsEnum(["Planning", "In Progress", "Completed", "On Hold", "Cancelled"], {
    message: validationMessage(messageKey.field_enum_validation_error, {
      ":field": "status",
      ":values": "Planning, In Progress, Completed, On Hold, Cancelled",
    }),
  })
  status?: string

  @ApiProperty({
    description:
      "Filter by multiple project statuses as comma separated values",
    example: "Planning,In Progress",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "statuses",
      ":type": "string",
    }),
  })
  statuses?: 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: "Filter by client ID",
    example: 1,
    required: false,
  })
  @IsOptional()
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "client_id",
      ":type": "integer",
    }),
  })
  client_id?: number

  @ApiProperty({
    description: "Order by column name",
    example: "created_at",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "column_name",
      ":type": "string",
    }),
  })
  column_name?: string

  @ApiProperty({
    description: "Order direction",
    example: "DESC",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "order",
      ":type": "string",
    }),
  })
  order?: string

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

  @ApiProperty({
    description: "Filter by is time tracking",
    example: "true",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "is_time_tracking",
      ":type": "string",
    }),
  })
  is_time_tracking?: string

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