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

export class UpdateBookingHotelItemDto {
  @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() nights: number;
  @IsNumber() @IsOptional() pax_per_room?: number;
  @IsNumber() @IsOptional() num_rooms?: number;
  @IsNumber() @IsOptional() aweb?: number;
  @IsNumber() @IsOptional() cweb?: number;
  @IsNumber() @IsOptional() cnb?: number;
  @IsNumber() @IsOptional() subtotal?: number;
  @IsString() @IsOptional() @MaxLength(1000) notes?: string;
}

export class UpdateBookingTransportItemDto {
  @IsUUID() transport_service_id: string;
  @IsString() @MaxLength(100) vehicle_type: string;
  @IsNumber() @IsOptional() @Min(1) quantity?: number;
  @IsNumber() @IsOptional() unit_price?: number;
  @IsNumber() @IsOptional() subtotal?: number;
  @IsDateString() @IsOptional() date?: string;
  @IsNumber() @IsOptional() sort_order?: number;
  @IsString() @IsOptional() @MaxLength(1000) notes?: string;
  @IsUUID() @IsOptional() supplier_id?: string;
  @IsUUID() @IsOptional() driver_id?: string;
  @IsUUID() @IsOptional() vehicle_id?: 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(20) assignment_status?: string;
}

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

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

export class UpdateBookingDto {
  // Basic details
  @IsString() @IsOptional() @MaxLength(255) guest_name?: string;
  @IsString() @IsOptional() @MaxLength(20) guest_mobile?: string;
  @IsString() @IsOptional() @MaxLength(255) guest_email?: string;
  @IsString() @IsOptional() @MaxLength(20) guest_alt_phone?: string;
  @IsDateString() @IsOptional() start_date?: string;
  @IsDateString() @IsOptional() end_date?: string;
  @IsNumber() @IsOptional() @Min(1) adults?: number;
  @IsArray() @IsOptional() children_ages?: number[];
  @IsNumber() @IsOptional() infants?: number;

  @IsString() @IsOptional() @MaxLength(2000) notes?: string;
  @IsString() @IsOptional() @MaxLength(20) status?: string;
  @IsArray() @IsOptional() @IsUUID(undefined, { each: true })
  sales_team?: string[];

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

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

  // Selling price fields
  @IsUUID() @IsOptional() selling_currency_id?: string;
  @IsNumber() @IsOptional() exchange_rate?: number;
  @IsNumber() @IsOptional() selling_total?: number;
  @IsString() @IsOptional() @MaxLength(50) pricing_strategy?: string;
  @IsString() @IsOptional() @MaxLength(20) markup_type?: string;
  @IsNumber() @IsOptional() markup_amount?: number;
  @IsNumber() @IsOptional() hotel_markup?: number;
  @IsNumber() @IsOptional() transport_markup?: number;
  @IsNumber() @IsOptional() activity_markup?: number;
  @IsNumber() @IsOptional() special_markup?: number;
  @IsNumber() @IsOptional() rounding?: number;
  @IsString() @IsOptional() @MaxLength(2000) internal_comments?: string;
  @IsString() @IsOptional() @MaxLength(2000) customer_remarks?: string;

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

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

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

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