import { ApiProperty } from "@nestjs/swagger"
import { IsOptional, IsString, IsInt, IsEnum } from "class-validator"
import { Type } from "class-transformer"
import { validationMessage } from "../../../utils/helpers"
import { messageKey } from "../../../constants/message-keys"
import { SubscriptionStatus } from "../entities/company-subscription.entity"

export class CompanyFiltersDto {
  @ApiProperty({
    description: "Search by company name",
    example: "Acme",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "search",
      ":type": "string",
    }),
  })
  search?: string

  @ApiProperty({
    description: "Filter by subscription status",
    example: "active",
    enum: SubscriptionStatus,
    required: false,
  })
  @IsOptional()
  @IsEnum(SubscriptionStatus, {
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "subscription_status",
      ":type": "active, expired, or upcoming",
    }),
  })
  subscription_status?: SubscriptionStatus

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

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

  @ApiProperty({
    description: "Sort by field",
    example: "created_at",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "order_by",
      ":type": "string",
    }),
  })
  order_by?: string = "created_at"

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

  @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
}
