import {
  IsString, IsUUID, IsOptional, IsNumber, IsArray, IsDateString,
  IsEmail, Min, MaxLength, ValidateNested,
} from 'class-validator';
import { Type } from 'class-transformer';

/**
 * Quick Booking DTO — walk-in / ad-hoc flow.
 *
 * The service creates a query + quote + booking in one transaction:
 *   1. queries   (stage=CONVERTED, source=Direct Walk-in by default)
 *   2. query_quotes (is_selected=true, markup=0)
 *   3. quote children from the *_items arrays below
 *   4. bookings  (is_quick_booking=true, status auto-derived from dates)
 *   5. booking children mirroring the quote children
 */

export class QuickHotelItemDto {
  @IsUUID() hotel_id: string;
  @IsString() @IsOptional() @MaxLength(100) room_type?: string;
  @IsString() @IsOptional() @MaxLength(100) meal_plan?: string;
  @IsDateString() check_in_date: string;
  @IsDateString() check_out_date: string;
  @IsNumber() @Min(1) nights: number;
  @IsNumber() @IsOptional() pax_per_room?: number;
  @IsNumber() @IsOptional() num_rooms?: number;
  @IsNumber() subtotal: number;
}

export class QuickTransportItemDto {
  @IsUUID() transport_service_id: string;
  @IsString() @MaxLength(100) vehicle_type: string;
  @IsNumber() @Min(1) quantity: number;
  @IsNumber() unit_price: number;
  @IsNumber() subtotal: number;
  @IsDateString() @IsOptional() date?: string;
  @IsString() @IsOptional() @MaxLength(10) pickup_time?: string;
  @IsString() @IsOptional() @MaxLength(500) pickup_address?: string;
  @IsString() @IsOptional() @MaxLength(500) dropoff_address?: string;
  @IsString() @IsOptional() @MaxLength(1000) notes?: string;
}

export class QuickActivityItemDto {
  @IsUUID() activity_id: string;
  @IsUUID() @IsOptional() ticket_id?: string;
  @IsString() @MaxLength(50) age_group: string;
  @IsNumber() @Min(1) quantity: number;
  @IsNumber() unit_price: number;
  @IsNumber() subtotal: number;
  @IsDateString() @IsOptional() date?: string;
  @IsString() @IsOptional() @MaxLength(100) slot?: string;
  @IsString() @IsOptional() @MaxLength(1000) notes?: string;
}

export class QuickSpecialItemDto {
  @IsString() @MaxLength(255) service_name: string;
  @IsNumber() total_price: number;
  @IsDateString() @IsOptional() date?: string;
  @IsString() @IsOptional() @MaxLength(1000) comments?: string;
}

export class CreateQuickBookingDto {
  // ─── Customer (goes on the query row) ───
  @IsString() @MaxLength(255) guest_name: string;
  @IsString() @MaxLength(20) guest_mobile: string;
  @IsEmail() @IsOptional() guest_email?: string;
  @IsString() @IsOptional() @MaxLength(20) guest_alt_phone?: string;

  @IsUUID() destination_id: string;
  @IsUUID() @IsOptional() source_id?: string;          // defaults to Direct Walk-in
  @IsUUID() @IsOptional() currency_id?: string;        // defaults to destination currency

  @IsDateString() start_date: string;
  @IsDateString() @IsOptional() end_date?: string;     // blank by default; service fills with start_date

  @IsNumber() @Min(1) adults: number;
  @IsArray() @IsOptional() children_ages?: number[];
  @IsNumber() @IsOptional() @Min(0) infants?: number;

  @IsArray() @IsOptional() sales_team?: string[];

  // ─── Services (at least one must be provided) ───
  @IsArray() @IsOptional() @ValidateNested({ each: true }) @Type(() => QuickHotelItemDto)
  hotel_items?: QuickHotelItemDto[];

  @IsArray() @IsOptional() @ValidateNested({ each: true }) @Type(() => QuickTransportItemDto)
  transport_items?: QuickTransportItemDto[];

  @IsArray() @IsOptional() @ValidateNested({ each: true }) @Type(() => QuickActivityItemDto)
  activity_items?: QuickActivityItemDto[];

  @IsArray() @IsOptional() @ValidateNested({ each: true }) @Type(() => QuickSpecialItemDto)
  special_items?: QuickSpecialItemDto[];

  // ─── Selling (optional — defaults to cost) ───
  @IsUUID() @IsOptional() selling_currency_id?: string;
  @IsNumber() @IsOptional() exchange_rate?: number;
  @IsNumber() @IsOptional() selling_total?: number;

  @IsString() @IsOptional() @MaxLength(2000) notes?: string;
}
