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

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

  @ApiProperty({
    description: "Search term to filter by name or description",
    example: "development",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "search",
      ":type": "string",
    }),
  })
  search?: string

  @ApiProperty({
    description: "Filter by status",
    example: 1,
    required: false,
  })
  @IsOptional()
  @Type(() => Number)
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "status",
      ":type": "integer",
    }),
  })
  status?: number

  @ApiProperty({
    description: "Filter by location requirement",
    example: true,
    required: false,
  })
  @IsOptional()
  @Transform(({ value }) => {
    if (value === "true" || value === true) return true
    if (value === "false" || value === false) return false
    return value
  })
  @IsBoolean({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "location_required",
      ":type": "boolean",
    }),
  })
  location_required?: boolean

  @ApiProperty({
    description: "Column name for sorting",
    example: "name",
    required: false,
    enum: ["name", "created_at"],
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "column_name",
      ":type": "string",
    }),
  })
  @IsIn(["name", "created_at"], {
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "column_name",
      ":type": "one of: name, created_at",
    }),
  })
  column_name?: string

  @ApiProperty({
    description: "Sort order",
    example: "ASC",
    required: false,
    default: "ASC",
    enum: ["ASC", "DESC"],
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "order",
      ":type": "string",
    }),
  })
  @IsIn(["ASC", "DESC"], {
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "order",
      ":type": "ASC or DESC",
    }),
  })
  order?: string

  @ApiProperty({
    description: "Project ID to filter activities by project",
    example: 1,
    required: false,
  })
  @IsOptional()
  @Type(() => Number)
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "project_id",
      ":type": "integer",
    }),
  })
  project_id?: number

  @ApiProperty({
    description:
      "When true and project_id is provided, only shows activities assigned to the project. When false or not provided with project_id, falls back to all activities if no assigned activities exist.",
    example: true,
    required: false,
  })
  @IsOptional()
  @Transform(({ value }) => {
    if (value === "true" || value === true) return true
    if (value === "false" || value === false) return false
    return value
  })
  @IsBoolean({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "show_only_assigned_activity",
      ":type": "boolean",
    }),
  })
  show_only_assigned_activity?: boolean
}
