import sourceData from "./route-atlas-source.json";
import { routeAtlasUi } from "./route-atlas-ui";

export type RouteAtlasSource = {
  id: string;
  title: string;
  publisher: string;
  url: string;
  accessed: string;
  authority: string;
  use: string;
};

export type RouteAtlasRoute = {
  id: string;
  slug: string;
  name: string;
  version: string;
  purpose: string;
  start: string;
  end: string;
  entry_gate: string;
  exit_gate: string;
  roads: string[];
  instructions: string[];
  junctions: string[];
  direction: string;
  stops: string[];
  distance: string;
  minimum_time: string;
  planning_duration: string;
  surface: string;
  category: string;
  complexity: string;
  timing_sensitivity: string;
  return_flexibility: string;
  facilities: string;
  fuel: string;
  turnaround: string;
  return_logic: string;
  limitation: string;
  gate_margin: string;
  sources: string[];
  verification: string;
  status: string;
  map_mode: string;
  map_path: string[];
  map_file: string;
};

type RouteAtlasSourceData = {
  product: string;
  edition: string;
  version: string;
  publication_date: string;
  last_verification_date: string;
  update_notice: string;
  independence_notice: string;
  map_notice: string;
  routes: RouteAtlasRoute[];
  facilities: Record<string, unknown>;
  gate_times: unknown[];
  sources: RouteAtlasSource[];
};

const atlas = sourceData as RouteAtlasSourceData;

export type RouteAtlasGuide = RouteAtlasRoute & {
  routeNumber: number;
  shortTitle: string;
  badge: string;
  image: string;
  galleryImages: Array<{ src: string; alt: string; label: string }>;
  mapImage: string;
  sourceDetails: RouteAtlasSource[];
  decision: string;
  goodFor: string[];
  wildlife: string[];
  pdfUrl: string;
};

function routeNumberFromId(id: string) {
  const match = id.match(/(\d+)/);
  return match ? Number(match[1]) : 0;
}

function routePdfName(route: RouteAtlasRoute) {
  const routeToken = route.id.replace(/\s+/g, "_");
  const titleToken = route.name.toUpperCase().replace(/[^A-Z0-9]+/g, "_").replace(/^_|_$/g, "");
  return `MPC_ROUTE_ATLAS_${routeToken}_${titleToken}_FLAGSHIP_V2.0.pdf`;
}

export const routeAtlasBundle = {
  slug: "marloth-kruger-route-atlas",
  title: "MPC Premium Route Atlas",
  shortTitle: "Route Atlas",
  edition: "Flagship Edition",
  version: "2.0",
  buildVersion: "6.82.190",
  publicationDate: atlas.publication_date,
  verificationDate: atlas.last_verification_date,
  price: 0,
  normalValue: 0,
  sizeLabel: "Free visitor guide",
  privateFile: "",
  image: "/images/route-atlas/route-atlas-overview.webp",
  previewImage: "/images/route-atlas/flagship/visual-master.webp",
  description: "An independent route-planning system for Marloth Park visitors exploring the southern Kruger gateways and surrounding Lowveld.",
  includes: atlas.routes.map((route) => `${route.id}: ${route.name}`),
  updateNotice: atlas.update_notice,
  independenceNotice: atlas.independence_notice,
  mapNotice: atlas.map_notice,
  masterPdf: "/downloads/route-atlas/MPC_ROUTE_ATLAS_FLAGSHIP_MASTER_PRINT_V2.0.pdf",
  mobilePdf: "/downloads/route-atlas/MPC_ROUTE_ATLAS_FLAGSHIP_MOBILE_V2.0.pdf",
};

export const firstTimeMarlothKrugerBundle = {
  slug: "first-time-marloth-kruger-visitors-bundle",
  legacySlug: "marloth-kruger-visitor-guide-set",
  title: "First-Time Marloth & Kruger Visitors Guide",
  shortTitle: "First-Time Visitors Guide",
  price: 0,
  normalValue: 0,
  sizeLabel: "Free to view on Marloth Park Central",
  privateFile: "",
  image: "/images/heroes/first-time-marloth-kruger-visitor-bundle-hero.webp",
  cover: "/images/homepage/free-guide-set.webp",
  description: "The First-Time Marloth & Kruger Visitors Guide gives first-time visitors practical planning help to read on site.",
  includes: [
    "Marloth Park arrival preparation",
    "First-night supply planning",
    "Crocodile Bridge and Malelane gate choice",
    "First Kruger day planning",
    "Family comfort planning",
    "Safe exit timing",
    "Self-drive visitor etiquette",
    "Direct access to all 10 Route Atlas pages",
  ],
};

const routeVisuals = Array.from({ length: 10 }, (_, index) => {
  const number = String(index + 1).padStart(2, "0");
  return {
    image: `/images/route-atlas/route-${number}-hero.webp`,
    landscape: `/images/route-atlas/route-${number}-landscape.webp`,
    wildlife: `/images/route-atlas/route-${number}-wildlife.webp`,
    mapImage: `/images/route-atlas/maps/MPC_ROUTE_ATLAS_ROUTE_${number}_MAP_V1.0.svg`,
  };
});

export const routeAtlasGuides: RouteAtlasGuide[] = atlas.routes.map((route) => {
  const routeNumber = routeNumberFromId(route.id);
  const visual = routeVisuals[routeNumber - 1];
  const ui = routeAtlasUi[route.id];
  const sourceDetails = route.sources
    .map((sourceId) => atlas.sources.find((source) => source.id === sourceId))
    .filter((source): source is RouteAtlasSource => Boolean(source));

  return {
    ...route,
    routeNumber,
    shortTitle: route.name,
    badge: route.id,
    image: visual.image,
    galleryImages: [
      { src: visual.landscape, alt: `${route.name} Lowveld route landscape`, label: "Route landscape" },
      { src: visual.wildlife, alt: `${route.name} wildlife context`, label: "Wildlife context" },
      { src: visual.image, alt: `${route.name} route overview`, label: "Route overview" },
    ],
    mapImage: visual.mapImage,
    sourceDetails,
    decision: ui.decision,
    goodFor: ui.goodFor,
    wildlife: ui.wildlife,
    pdfUrl: `/downloads/route-atlas/${routePdfName(route)}`,
  };
});

export const routeAtlasSources = atlas.sources;

const legacyRouteAliases: Record<string, string> = {
  "crocodile-bridge": "route-01-marloth-park-to-crocodile-bridge-gate",
  "malelane-gate": "route-02-marloth-park-to-malelane-gate",
  "lower-sabie": "route-03-crocodile-bridge-to-lower-sabie-direct-return",
  "first-time-kruger-day": "route-03-crocodile-bridge-to-lower-sabie-direct-return",
  "family-safari-comfort": "route-04-crocodile-bridge-lower-sabie-mixed-circuit",
  "two-gate-choice": "route-06-crocodile-bridge-skukuza-malelane-two-gate-circuit",
  "safe-exit-timing": "route-09-malelane-gate-to-skukuza-direct-return",
  "marloth-park-to-crocodile-bridge-gate": "route-01-marloth-park-to-crocodile-bridge-gate",
  "marloth-park-to-malelane-gate": "route-02-marloth-park-to-malelane-gate",
  "crocodile-bridge-to-lower-sabie-direct-return": "route-03-crocodile-bridge-to-lower-sabie-direct-return",
  "crocodile-bridge-lower-sabie-mixed-circuit": "route-04-crocodile-bridge-lower-sabie-mixed-circuit",
  "crocodile-bridge-to-tshokwane-return": "route-05-crocodile-bridge-to-tshokwane-return",
  "crocodile-bridge-skukuza-malelane-two-gate-circuit": "route-06-crocodile-bridge-skukuza-malelane-two-gate-circuit",
  "malelane-gate-to-berg-en-dal-direct-return": "route-07-malelane-gate-to-berg-en-dal-direct-return",
  "malelane-gate-berg-en-dal-matjulu-loop": "route-08-malelane-gate-berg-en-dal-matjulu-loop",
  "malelane-gate-to-skukuza-direct-return": "route-09-malelane-gate-to-skukuza-direct-return",
  "malelane-skukuza-lower-sabie-crocodile-bridge-two-gate-circuit": "route-10-malelane-skukuza-lower-sabie-crocodile-bridge-two-gate-circuit",
};

export function findRouteAtlasGuide(slug: string) {
  const canonicalSlug = legacyRouteAliases[slug] || slug;
  return routeAtlasGuides.find((guide) => guide.slug === canonicalSlug);
}
