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

export enum TimeFrameType {
  MONTHLY = "monthly",
  QUARTERLY = "quarterly",
  YEARLY = "yearly",
}

export class ProjectCostingFiltersDto {
  @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: "Filter by project ID",
    example: 1,
    required: false,
  })
  @IsOptional()
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "project_id",
      ":type": "integer",
    }),
  })
  project_id?: number

  @ApiProperty({
    description: "Year for the report",
    example: 2025,
    required: false,
  })
  @IsOptional()
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "year",
      ":type": "integer",
    }),
  })
  year?: number

  @ApiProperty({
    description: "Time frame for the report",
    example: TimeFrameType.MONTHLY,
    enum: TimeFrameType,
    required: false,
  })
  @IsOptional()
  @IsEnum(TimeFrameType, {
    message: validationMessage(messageKey.field_enum_validation_error, {
      ":field": "time_frame",
      ":values": Object.values(TimeFrameType).join(", "),
    }),
  })
  time_frame?: TimeFrameType

  @ApiProperty({
    description: "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 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: "All employee project costing report",
    example: true,
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "show_all",
      ":type": "string",
    }),
  })
  show_all?: string

  @ApiProperty({
    description: "Date range type",
    example: DateRangeType.THIS_MONTH,
    enum: DateRangeType,
    required: false,
  })
  @IsOptional()
  @IsEnum(DateRangeType, {
    message: validationMessage(messageKey.field_enum_validation_error, {
      ":field": "date_range",
      ":values": Object.values(DateRangeType).join(", "),
    }),
  })
  date_range?: DateRangeType

  @ApiProperty({
    description: "Custom start date (required when date_range is custom)",
    example: "2025-01-01",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "start_date",
      ":type": "string",
    }),
  })
  start_date?: string

  @ApiProperty({
    description: "Custom end date (required when date_range is custom)",
    example: "2025-01-31",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "end_date",
      ":type": "string",
    }),
  })
  end_date?: string
}
