import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { PropertyType } from '@prisma/client';
import { Type } from 'class-transformer';
import {
  IsBoolean,
  IsEnum,
  IsIn,
  IsInt,
  IsNumber,
  IsOptional,
  IsString,
  Max,
  MaxLength,
  Min,
} from 'class-validator';

export type FloodZoneRisk = 'NONE' | 'LOW' | 'MEDIUM' | 'HIGH';

export const FLOOD_ZONE_RISK_VALUES: FloodZoneRisk[] = ['NONE', 'LOW', 'MEDIUM', 'HIGH'];

export class PredictValuationDto {
  // ── Core v1 fields ─────────────────────────────────────────────────
  @ApiProperty({ enum: PropertyType, description: 'Loại bất động sản' })
  @IsEnum(PropertyType)
  propertyType!: PropertyType;

  @ApiProperty({ description: 'Diện tích (m²)', example: 75 })
  @IsNumber()
  @Min(1)
  @Type(() => Number)
  area!: number;

  @ApiProperty({ description: 'Quận/Huyện', example: 'Quận 1' })
  @IsString()
  district!: string;

  @ApiProperty({ description: 'Tỉnh/Thành phố', example: 'Hồ Chí Minh' })
  @IsString()
  city!: string;

  @ApiPropertyOptional({ description: 'Số phòng ngủ', example: 2 })
  @IsOptional()
  @IsInt()
  @Min(0)
  @Max(20)
  @Type(() => Number)
  bedrooms?: number;

  @ApiPropertyOptional({ description: 'Số phòng tắm' })
  @IsOptional()
  @IsInt()
  @Min(0)
  @Max(20)
  @Type(() => Number)
  bathrooms?: number;

  @ApiPropertyOptional({ description: 'Số tầng' })
  @IsOptional()
  @IsInt()
  @Min(0)
  @Max(200)
  @Type(() => Number)
  floors?: number;

  @ApiPropertyOptional({ description: 'Mặt tiền (m)' })
  @IsOptional()
  @IsNumber()
  @Min(0)
  @Type(() => Number)
  frontage?: number;

  @ApiPropertyOptional({ description: 'Độ rộng đường trước nhà (m)' })
  @IsOptional()
  @IsNumber()
  @Min(0)
  @Type(() => Number)
  roadWidth?: number;

  @ApiPropertyOptional({ description: 'Năm xây' })
  @IsOptional()
  @IsInt()
  @Min(1900)
  @Max(2100)
  @Type(() => Number)
  yearBuilt?: number;

  @ApiPropertyOptional({ description: 'Có giấy tờ pháp lý đầy đủ' })
  @IsOptional()
  @IsBoolean()
  hasLegalPaper?: boolean;

  @ApiPropertyOptional({ description: 'Vĩ độ' })
  @IsOptional()
  @IsNumber()
  @Type(() => Number)
  latitude?: number;

  @ApiPropertyOptional({ description: 'Kinh độ' })
  @IsOptional()
  @IsNumber()
  @Type(() => Number)
  longitude?: number;

  @ApiPropertyOptional({ description: 'ID dự án (nếu thuộc dự án)' })
  @IsOptional()
  @IsString()
  projectId?: string;

  @ApiPropertyOptional({ description: 'URL ảnh BĐS để phân tích' })
  @IsOptional()
  @IsString()
  imageUrl?: string;

  @ApiPropertyOptional({ description: 'Mô tả bổ sung' })
  @IsOptional()
  @IsString()
  @MaxLength(2000)
  description?: string;

  @ApiPropertyOptional({ description: 'Bật phân tích chuyên sâu (Claude)' })
  @IsOptional()
  @IsBoolean()
  deepAnalysis?: boolean;

  // ── AVM v2 fields ──────────────────────────────────────────────────
  @ApiPropertyOptional({ description: 'Dùng mô hình AVM v2 (ensemble + đặc trưng mở rộng)' })
  @IsOptional()
  @IsBoolean()
  useV2?: boolean;

  @ApiPropertyOptional({ description: 'Khoảng cách tới bệnh viện (km)' })
  @IsOptional()
  @IsNumber()
  @Min(0)
  @Type(() => Number)
  distanceToHospitalKm?: number;

  @ApiPropertyOptional({ description: 'Khoảng cách tới công viên (km)' })
  @IsOptional()
  @IsNumber()
  @Min(0)
  @Type(() => Number)
  distanceToParkKm?: number;

  @ApiPropertyOptional({ description: 'Khoảng cách tới trung tâm thương mại (km)' })
  @IsOptional()
  @IsNumber()
  @Min(0)
  @Type(() => Number)
  distanceToMallKm?: number;

  @ApiPropertyOptional({
    enum: FLOOD_ZONE_RISK_VALUES,
    description: 'Mức độ nguy cơ ngập lụt',
  })
  @IsOptional()
  @IsIn(FLOOD_ZONE_RISK_VALUES)
  floodZoneRisk?: FloodZoneRisk;

  @ApiPropertyOptional({ description: 'Có thang máy' })
  @IsOptional()
  @IsBoolean()
  hasElevator?: boolean;

  @ApiPropertyOptional({ description: 'Có chỗ đậu xe' })
  @IsOptional()
  @IsBoolean()
  hasParking?: boolean;

  @ApiPropertyOptional({ description: 'Có hồ bơi' })
  @IsOptional()
  @IsBoolean()
  hasPool?: boolean;
}
