import type { AccommodationListing, AdminState, Supplier } from "@/lib/mpc-types";
import { isPrelaunchAccommodationSlot, primaryAccommodationImage, publicAccommodationListings } from "@/lib/accommodation";
import { publicSupplierForRender, publicSupplierIsVisible } from "@/lib/public-supplier";

export type SelectedListingType =
  | "holiday-home"
  | "service"
  | "local-option"
  | "restaurant"
  | "safari-drive"
  | "activity";

export type SelectedListingPrimaryCta = "call" | "whatsapp" | "enquire" | "book";

export type SelectedListing = {
  id: string;
  slug: string;
  name: string;
  listingType: SelectedListingType;
  categories: string[];
  featured: boolean;
  priority: number;
  contactPerson?: string;
  phone?: string;
  whatsapp?: string;
  email?: string;
  website?: string;
  shortDescription: string;
  fullDescription: string;
  area?: string;
  images: string[];
  badges: string[];
  primaryCta: SelectedListingPrimaryCta;
  homepageHighlight?: boolean;
  homepageHighlightOrder?: number;
  featuredPartner?: boolean;
  seasonalPricing?: {
    peakSeason?: { label: string; price: string }[];
    outOfPeakSeason?: { label: string; price: string }[];
    note?: string;
  };
  priceNotes?: string;
  relatedListings: string[];
  relatedGuideLinks: string[];
  seoTitle: string;
  seoDescription: string;
  indexable: boolean;
  sourceKind: "supplier" | "accommodation";
  sourceSupplier?: Supplier;
  sourceAccommodation?: AccommodationListing;
};

export const selectedListingTypeLabels: Record<SelectedListingType, string> = {
  "holiday-home": "Holiday home",
  service: "Local service",
  "local-option": "Local option",
  restaurant: "Restaurant / food",
  "safari-drive": "Safari drive",
  activity: "Activity",
};

export const selectedListingHubRoutes: Record<SelectedListingType, string> = {
  "holiday-home": "/accommodation",
  service: "/services",
  "local-option": "/local-options",
  restaurant: "/restaurants",
  "safari-drive": "/safari-drives",
  activity: "/local/activities",
};

export function selectedListingPath(listing: Pick<SelectedListing, "listingType" | "slug">) {
  switch (listing.listingType) {
    case "holiday-home": return `/accommodation/${listing.slug}`;
    case "restaurant": return `/restaurants/${listing.slug}`;
    case "safari-drive": return `/safari-drives/${listing.slug}`;
    case "local-option": return `/local-options/${listing.slug}`;
    case "activity": return `/local/${listing.slug}`;
    case "service":
    default:
      return `/local/${listing.slug}`;
  }
}

export function selectedListingTypeFromSupplier(supplier: Supplier): SelectedListingType {
  const haystack = `${supplier.name} ${supplier.category} ${supplier.subcategory} ${supplier.services?.join(" ") || ""} ${supplier.description}`.toLowerCase();
  if (supplier.slug === "marloth-park-central-local-delivery") return "service";
  if (supplier.category === "food") return "restaurant";
  if (/safari|game drive|kruger drive|guided drive|wild safaris|kruger safari|bush walks/.test(haystack)) return "safari-drive";
  if (/home[- ]?based care|home care|elderly care|personal care|wound care|mobility assistance|palliative|vital checks|mobile mechanic|towing|roadside|breakdown tow|vehicle recovery|vehicle repairs|vehicle servicing|local delivery|grocery delivery|lift service|supermarket trip|shuttle|airport transfer|guest transport|local trips|transport to|transport from|crocodile bridge transport/.test(haystack)) return "service";
  if (supplier.category === "activities") return "activity";
  if (["supplies", "help", "visitor-services", "traveller-services"].includes(supplier.category)) return "local-option";
  if (["maintenance", "electrical", "plumbing", "cleaning", "gardening", "pool-service", "security", "property-management"].includes(supplier.category)) return "service";
  return "local-option";
}

function cleanList(values: Array<string | undefined | null>) {
  return Array.from(new Set(values.map((value) => String(value || "").trim()).filter(Boolean)));
}

function supplierBadges(supplier: Supplier, listingType: SelectedListingType) {
  const packageLabel = supplier.package === "sponsor" ? "Featured" : supplier.package === "premium" ? "Featured" : supplier.package === "featured" ? "Featured" : "Selected";
  return cleanList([packageLabel, selectedListingTypeLabels[listingType], supplier.subcategory, supplier.serviceArea]);
}

export function supplierToSelectedListing(supplierInput: Supplier): SelectedListing {
  const supplier = publicSupplierForRender(supplierInput);
  const listingType = selectedListingTypeFromSupplier(supplier);
  const featured = ["sponsor", "premium", "featured"].includes(supplier.package);
  const path = selectedListingPath({ listingType, slug: supplier.slug });
  const shortDescription = supplier.description.replace(/\s+/g, " ").trim();
  return {
    id: supplier.id,
    slug: supplier.slug,
    name: supplier.name,
    listingType,
    categories: cleanList([supplier.category, supplier.subcategory, ...(supplier.services || [])]),
    featured,
    priority: Number.isFinite(supplier.sortOrder) ? supplier.sortOrder : featured ? 20 : 100,
    contactPerson: supplier.contactName || undefined,
    phone: supplier.phoneNumber || undefined,
    whatsapp: supplier.whatsappNumber || undefined,
    email: supplier.email || undefined,
    website: supplier.bookingUrl || supplier.websiteUrl || undefined,
    shortDescription,
    fullDescription: shortDescription,
    area: supplier.serviceArea,
    images: cleanList([supplier.imageSrc]),
    badges: supplierBadges(supplier, listingType),
    primaryCta: supplier.whatsappNumber ? "whatsapp" : supplier.phoneNumber ? "call" : "enquire",
    homepageHighlight: featured,
    homepageHighlightOrder: Number.isFinite(supplier.sortOrder) ? supplier.sortOrder : undefined,
    featuredPartner: featured,
    relatedListings: [],
    relatedGuideLinks: ["/guides", "/free-guides", "/route-atlas"],
    seoTitle: supplier.seoTitle || `${supplier.name} | ${selectedListingTypeLabels[listingType]} in Marloth Park`,
    seoDescription: supplier.seoDescription || shortDescription || `Selected ${selectedListingTypeLabels[listingType].toLowerCase()} listing for Marloth Park visitors, hosts and local users.`,
    indexable: supplier.status === "live",
    sourceKind: "supplier",
    sourceSupplier: supplier,
  };
}

export function accommodationToSelectedListing(listing: AccommodationListing): SelectedListing {
  const image = primaryAccommodationImage(listing);
  const featured = Boolean(listing.featured || listing.partnerBadge || listing.tier === "featured" || listing.tier === "top-featured" || listing.tier === "partner");
  const shortDescription = (listing.shortDescription || listing.description || listing.tagline || "Selected Marloth Park holiday home.").replace(/\s+/g, " ").trim();
  return {
    id: listing.id,
    slug: listing.slug,
    name: listing.name,
    listingType: "holiday-home",
    categories: cleanList(["holiday-home", listing.tier, listing.locationLabel, ...(listing.categoryTags || []), ...(listing.amenities || []), ...(listing.bestFor || [])]),
    featured,
    priority: Number.isFinite(listing.sortOrder) ? listing.sortOrder : featured ? 10 : 100,
    contactPerson: listing.contactName || listing.ownerName || undefined,
    phone: listing.phoneNumber || listing.contactPhone || undefined,
    whatsapp: listing.whatsappNumber || listing.contactWhatsapp || undefined,
    email: listing.email || listing.contactEmail || listing.enquiryRecipientEmail || undefined,
    website: listing.websiteUrl || listing.externalBookingUrl || undefined,
    shortDescription,
    fullDescription: listing.description || shortDescription,
    area: listing.locationLabel || "Marloth Park",
    images: cleanList([image, ...(listing.images || []).map((item) => item.url)]),
    badges: cleanList([featured ? "Featured" : "Selected", "Holiday home", listing.sleeps ? `Sleeps ${listing.sleeps}` : undefined, listing.priceFromLabel]),
    primaryCta: listing.externalBookingUrl ? "book" : "enquire",
    homepageHighlight: featured || Boolean(listing.homepageEligible),
    homepageHighlightOrder: Number.isFinite(listing.sortOrder) ? listing.sortOrder : undefined,
    featuredPartner: featured,
    priceNotes: listing.priceFromLabel || undefined,
    relatedListings: [],
    relatedGuideLinks: ["/guides", "/free-guides", "/route-atlas"],
    seoTitle: `${listing.name} | Marloth Park Holiday Home`,
    seoDescription: shortDescription,
    indexable: listing.status === "active" && !isPrelaunchAccommodationSlot(listing),
    sourceKind: "accommodation",
    sourceAccommodation: listing,
  };
}

export function selectedListingsFromState(state: Pick<AdminState, "suppliers" | "accommodationListings">) {
  const supplierListings = (state.suppliers || [])
    .filter(publicSupplierIsVisible)
    .map(supplierToSelectedListing);
  const accommodationListings = publicAccommodationListings(state.accommodationListings || [])
    .map(accommodationToSelectedListing);
  return [...accommodationListings, ...supplierListings]
    .filter((listing) => listing.indexable)
    .sort((a, b) => a.priority - b.priority || a.name.localeCompare(b.name));
}

export function selectedListingsByType(listings: SelectedListing[], listingType: SelectedListingType) {
  return listings.filter((listing) => listing.listingType === listingType);
}

export function findSelectedListingForRoute(listings: SelectedListing[], routeType: SelectedListingType, slug: string) {
  return listings.find((listing) => listing.listingType === routeType && listing.slug === slug);
}

export function relatedSelectedListings(listings: SelectedListing[], current: SelectedListing, limit = 3) {
  const byExplicit = current.relatedListings.length
    ? listings.filter((listing) => current.relatedListings.includes(listing.slug) && listing.slug !== current.slug)
    : [];
  const categorySet = new Set(current.categories.map((item) => item.toLowerCase()));
  const byCategory = listings.filter((listing) => {
    if (listing.slug === current.slug || byExplicit.some((item) => item.slug === listing.slug)) return false;
    if (listing.listingType === current.listingType) return true;
    return listing.categories.some((category) => categorySet.has(category.toLowerCase()));
  });
  return [...byExplicit, ...byCategory].slice(0, limit);
}

export const selectedListingFoundationHubs = [
  { title: "Accommodation", href: "/accommodation", text: "Selected Marloth Park holiday homes and self-catering stay options." },
  { title: "Local services", href: "/services", text: "Curated service listings for practical Marloth Park help." },
  { title: "Local options", href: "/local-options", text: "Useful shops, supplies, visitor stops and local options." },
  { title: "Restaurants / food", href: "/restaurants", text: "Selected food and restaurant options for Marloth Park visitors." },
  { title: "Safari drives / activities", href: "/safari-drives", text: "Selected safari drive and activity routes for visitor planning." },
  { title: "Guides", href: "/guides", text: "Free Marloth Park visitor-planning resources to view on site." },
  { title: "Visitor help", href: "/visitor-help", text: "Practical help paths for first-time visitors, hosts and local users." },
];
