import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import {
  IsBoolean,
  IsInt,
  IsNotEmpty,
  IsObject,
  IsOptional,
  IsString,
  MaxLength,
  Min,
} from 'class-validator';

export class CreateSavedSearchDto {
  @ApiProperty({ description: 'Tên tìm kiếm đã lưu', example: 'Chung cư Quận 7 dưới 3 tỷ' })
  @IsNotEmpty({ message: 'Tên tìm kiếm không được để trống' })
  @IsString()
  @MaxLength(100, { message: 'Tên tìm kiếm không được vượt quá 100 ký tự' })
  name!: string;

  @ApiProperty({ description: 'Bộ lọc tìm kiếm (JSON)', example: { propertyType: 'apartment', district: 'Quan 7', priceMax: 3000000000 } })
  @IsObject()
  filters!: Record<string, unknown>;

  @ApiPropertyOptional({ description: 'Bật thông báo khi có kết quả mới', default: true })
  @IsOptional()
  @IsBoolean()
  alertEnabled?: boolean;
}

export class UpdateSavedSearchDto {
  @ApiPropertyOptional({ description: 'Tên tìm kiếm đã lưu', example: 'Chung cư Quận 2' })
  @IsOptional()
  @IsString()
  @MaxLength(100, { message: 'Tên tìm kiếm không được vượt quá 100 ký tự' })
  name?: string;

  @ApiPropertyOptional({ description: 'Bộ lọc tìm kiếm (JSON)' })
  @IsOptional()
  @IsObject()
  filters?: Record<string, unknown>;

  @ApiPropertyOptional({ description: 'Bật/tắt thông báo' })
  @IsOptional()
  @IsBoolean()
  alertEnabled?: boolean;
}

export class SavedSearchListDto {
  @ApiPropertyOptional({ description: 'Trang', default: 1, minimum: 1 })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  page?: number;

  @ApiPropertyOptional({ description: 'Số lượng mỗi trang', default: 20, minimum: 1 })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  limit?: number;
}
