import {
  IsNotEmpty,
  IsOptional,
  IsString,
  IsUUID,
  IsNumber,
  IsArray,
  IsDateString,
  IsEnum,
  MaxLength,
  Min,
  ArrayMinSize,
} from 'class-validator';
import { QueryStage } from '../../../entities/query.entity';

export class CreateQueryDto {
  @IsUUID()
  @IsNotEmpty()
  source_id: string;

  @IsString()
  @IsOptional()
  @MaxLength(100)
  ref_id?: string;

  @IsArray()
  @ArrayMinSize(1, { message: 'At least one sales team member is required' })
  @IsUUID(undefined, { each: true })
  sales_team: string[];

  @IsArray()
  @IsOptional()
  @IsString({ each: true })
  source_tags?: string[];

  @IsArray()
  @IsOptional()
  @IsString({ each: true })
  remark_tags?: string[];

  @IsUUID()
  @IsNotEmpty()
  destination_id: string;

  @IsDateString()
  @IsNotEmpty()
  start_date: string;

  @IsDateString()
  @IsNotEmpty()
  end_date: string;

  @IsNumber()
  @IsNotEmpty()
  @Min(1)
  adults: number;

  @IsArray()
  @IsOptional()
  @IsNumber({}, { each: true })
  children_ages?: number[];

  @IsNumber()
  @IsOptional()
  infants?: number;

  // Optional — walk-in / lead-stage queries can be created before
  // guest identity is known. Zod schema on the FE has already been
  // relaxed; the BE was rejecting empty `guest_name` with a 400.
  @IsString()
  @IsOptional()
  @MaxLength(255)
  guest_name?: string;

  @IsString()
  @IsOptional()
  @MaxLength(255)
  guest_email?: string;

  // Optional — walk-in guests + email-only leads are real. The Zod
  // schema on the FE already treats this as optional; the BE was
  // enforcing it via class-validator and rejecting the save with a 400.
  @IsString()
  @IsOptional()
  @MaxLength(20)
  guest_mobile?: string;

  @IsString()
  @IsOptional()
  @MaxLength(20)
  guest_alt_phone?: string;

  @IsString()
  @IsOptional()
  notes?: string;

  @IsEnum(QueryStage)
  @IsOptional()
  stage?: QueryStage;
}
