import { z } from "zod";

const RoleConditionSchema = z.union([
  z.string(),
  z.object({
    and: z.array(z.string()),
    negation: z.boolean().optional(),
  }),
]);

const PriceValueSchema = z.union([
  z.number(),
  z.object({ checkin_days: z.record(z.string(), z.number()) }),
]);

const UnitPointsSchema = z
  .object({
    short_break_3: z.record(z.string(), PriceValueSchema).optional(),
    short_break_4: z.record(z.string(), PriceValueSchema).optional(),
    nights_3: z.record(z.string(), PriceValueSchema).optional(),
    nights_4: z.record(z.string(), PriceValueSchema).optional(),
    nights_6: z.record(z.string(), PriceValueSchema).optional(),
    daily: z.record(z.string(), PriceValueSchema).optional(),
    weekly: z.record(z.string(), PriceValueSchema).optional(),
    plus_pay: z.any().optional(),
    accept_peaks: z.boolean().optional(),
    accept_early_bird: z.boolean().optional(),
    accept_late_break: z.boolean().optional(),
  })
  .passthrough();

const OverrideBlockSchema = z
  .object({
    roles: z.array(RoleConditionSchema).optional(),
    settings: z.record(z.string(), z.any()).optional(),
  })
  .passthrough();

// Top level intentionally `.passthrough()`: mirrors the legacy
// hot-deals-travel-rules.json rule-object shape, which grows fields over
// time. Known fields are still type-checked below; unknown keys still
// round-trip via raw_config.
export const TravelRulePayloadSchema = z
  .object({
    resort: z.string().optional(),
    unit_code: z.string().min(1),
    alias_target_unit_code: z.string().optional(),
    rule_id: z.string().optional(),
    min_nights: z.number().optional(),
    max_nights: z.number().optional(),
    max_occ: z.number().optional(),
    confirm_from: z.string().optional(),
    confirm_to: z.string().optional(),
    is_active: z.boolean().optional(),
    publish_mode: z.enum(["DRAFT", "PUBLISHED"]).optional(),
    sort_order: z.number().optional(),
    roles: z.array(RoleConditionSchema).optional(),
    travel_between: z.array(z.tuple([z.string(), z.string()])).optional(),
    unit_points: UnitPointsSchema.optional(),
    override: z.record(z.string(), OverrideBlockSchema).optional(),
    terms_conditions: z.string().optional(),
    booking_caption: z.string().optional(),
    expose_option: z.boolean().optional(),
    with_checkin_day: z.boolean().optional(),
    hot_deal_type: z.number().optional(),
    more_rules: z.array(z.any()).optional(),
  })
  .passthrough();

export const CreateTravelRuleSchema = z.object({
  id: z.string().min(1),
  rule: TravelRulePayloadSchema,
});
export const UpdateTravelRuleSchema = TravelRulePayloadSchema;

export type CreateTravelRuleRequest = z.infer<typeof CreateTravelRuleSchema>;
export type UpdateTravelRuleRequest = z.infer<typeof UpdateTravelRuleSchema>;
