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

export class CreateHotelItemDto {
  @IsUUID() @IsNotEmpty() hotel_id: string;
  @IsString() @IsOptional() room_type?: string;
  @IsString() @IsOptional() meal_plan?: string;
  @IsDateString() @IsNotEmpty() check_in_date: string;
  @IsDateString() @IsNotEmpty() check_out_date: string;
  @IsNumber() @IsNotEmpty() 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;
  @IsArray() @IsOptional() nightly_rates?: { date: string; rate: number }[];
  @IsNumber() @IsOptional() subtotal?: number;
}

export class CreateTransportItemDto {
  @IsUUID() @IsNotEmpty() transport_service_id: string;
  @IsString() @IsNotEmpty() 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() notes?: string;
  @IsBoolean() @IsOptional() is_shared?: boolean;
}

export class CreateActivityItemDto {
  @IsUUID() @IsNotEmpty() activity_id: string;
  @IsUUID() @IsOptional() ticket_id?: string;
  @IsString() @IsNotEmpty() age_group: string;
  @IsNumber() @IsOptional() @Min(1) quantity?: number;
  @IsNumber() @IsOptional() unit_price?: number;
  @IsNumber() @IsOptional() subtotal?: number;
  @IsString() @IsOptional() slot?: string;
  @IsDateString() @IsOptional() date?: string;
  @IsNumber() @IsOptional() sort_order?: number;
  @IsString() @IsOptional() notes?: string;
}

export class CreateSpecialItemDto {
  @IsString() @IsNotEmpty() @MaxLength(255) service_name: string;
  @IsNumber() @IsNotEmpty() total_price: number;
  @IsDateString() @IsOptional() date?: string;
  @IsNumber() @IsOptional() sort_order?: number;
  @IsString() @IsOptional() comments?: string;
  @IsBoolean() @IsOptional() is_day_item?: boolean;
}

export class CreateQuoteDto {
  @IsNumber() @IsNotEmpty() @Min(1) quote_number: number;
  @IsString() @IsOptional() @MaxLength(100) label?: string;
  @IsBoolean() @IsOptional() is_selected?: boolean;
  @IsString() @IsOptional() notes?: string;

  // Markup & Selling Price
  @IsString() @IsOptional() pricing_strategy?: string;
  @IsUUID() @IsOptional() selling_currency_id?: string;
  @IsNumber() @IsOptional() exchange_rate?: number;
  @IsString() @IsOptional() markup_type?: string;
  @IsNumber() @IsOptional() rounding?: number;
  @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() transport_excluded_pax?: number;
  @IsNumber() @IsOptional() selling_total?: number;
  @IsString() @IsOptional() internal_comments?: string;
  @IsString() @IsOptional() customer_remarks?: string;

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

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

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

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