import { routePacks, type RoutePack } from "@/data/route-packs";

export type DayPlanPreference =
  | "big-5"
  | "scenic"
  | "birds"
  | "quiet"
  | "picnic"
  | "kids"
  | "return-safe";

export type DayPlanInput = {
  startLocation: "Marloth Park" | "Komatipoort" | "Malelane" | "Other";
  gate: "Crocodile Bridge" | "Malelane" | "Other";
  dateISO: string; // YYYY-MM-DD
  startTime: "gate-opening" | "06:00" | "07:00" | "08:00" | "09:00";
  durationHours: 4 | 6 | 8;
  preferences: DayPlanPreference[];
};

export type DayPlanResult = {
  routeSlug: RoutePack["slug"];
  routeTitle: string;
  summary: string;
  timeline: { title: string; text: string }[];
  stops: string[];
  checklist: string[];
  rules: string[];
  pdfDownloadUrl: string;
};

const routePdf = (_slug: string) => `/free-guides#free-guide-gate`;

export function suggestRouteSlug(input: DayPlanInput): RoutePack["slug"] {
  const prefs = new Set(input.preferences);
  if (prefs.has("kids")) return "marloth-kruger-visitor-guide-set";
  if (prefs.has("return-safe")) return "marloth-kruger-visitor-guide-set";
  if (prefs.has("scenic") && input.durationHours >= 6) return "marloth-kruger-visitor-guide-set";
  if (input.durationHours === 4) return "marloth-kruger-visitor-guide-set";
  return "marloth-kruger-visitor-guide-set";
}

export function buildDayPlan(input: DayPlanInput, forcedRouteSlug?: RoutePack["slug"]): DayPlanResult {
  const routeSlug = forcedRouteSlug || suggestRouteSlug(input);
  const pack = routePacks.find((p) => p.slug === routeSlug) || routePacks[0];
  const safeSlug = pack?.slug || routeSlug || "marloth-kruger-visitor-guide-set";
  const routeTitle = pack?.title || "MPC Kruger Day Plan";
  const summaryParts: string[] = [];
  summaryParts.push(`${input.gate} start`);
  summaryParts.push(`${input.durationHours}h plan`);
  if (input.preferences.length) summaryParts.push(input.preferences.map(labelForPreference).join(" · "));
  const summary = summaryParts.join(" • ");

  const timeline = (pack?.rhythm || []).map((item) => ({ title: item.title, text: item.text }));
  const stops = pack?.mapStops || [];
  const checklist = pack?.packChecklist || [];
  const rules = pack?.ruleReminders || [];
  const pdfDownloadUrl = routePdf(safeSlug);

  return { routeSlug: safeSlug as RoutePack["slug"], routeTitle, summary, timeline, stops, checklist, rules, pdfDownloadUrl };
}

export function labelForPreference(pref: DayPlanPreference) {
  switch (pref) {
    case "big-5":
      return "Big 5 focus";
    case "scenic":
      return "Scenic rhythm";
    case "birds":
      return "Birding";
    case "quiet":
      return "Quieter roads";
    case "picnic":
      return "Picnic stop";
    case "kids":
      return "Kids";
    case "return-safe":
      return "Safe return";
    default:
      return pref;
  }
}

export function isValidDayPlanInput(value: unknown): value is DayPlanInput {
  if (!value || typeof value !== "object") return false;
  const v = value as Partial<DayPlanInput>;
  if (!v.gate || !v.dateISO || !v.startTime || !v.durationHours) return false;
  if (!Array.isArray(v.preferences)) return false;
  return true;
}
