import type { AccommodationListing, AccommodationTier } from "./mpc-types";
import { accommodationLaunchPackageDefaults } from "./launch-revenue-model";
export { accommodationLaunchPackageDefaults } from "./launch-revenue-model";

export const accommodationTierLabels: Record<AccommodationTier, string> = {
  standard: "MPC Listed Holiday Home",
  featured: "MPC Featured Holiday Home",
  "top-featured": "MPC Top Featured Holiday Home",
  partner: "MPC Premium Partner Holiday Home",
};

export const accommodationTierCaps: Record<"partner" | "featured" | "top-featured", number> = {
  partner: 1,
  featured: 10,
  "top-featured": 5,
};

export const accommodationRevenueModel = [
  { tier: "partner" as const, label: "MPC Premium Partner Holiday Home", launchPrice: accommodationLaunchPackageDefaults.partner, renewalRule: "Allocated to Marlotii Safari House; R5,000 p/m if opened later", visibility: "Highest MPC holiday-home position and full showcase presentation." },
  { tier: "top-featured" as const, label: "MPC Top Featured Holiday Home", launchPrice: accommodationLaunchPackageDefaults["top-featured"], renewalRule: "Month 1 free; months 2-3 R350; from month 4 R3,500 p/m", visibility: "Full showcase presentation and homepage eligibility after the Premium Partner." },
  { tier: "featured" as const, label: "MPC Featured Holiday Home", launchPrice: accommodationLaunchPackageDefaults.featured, renewalRule: "Month 1 free; months 2-3 R350; from month 4 R2,500 p/m", visibility: "Selected holiday-home listing with stronger presentation and direct enquiry access." },
  { tier: "standard" as const, label: "MPC Listed Holiday Home", launchPrice: accommodationLaunchPackageDefaults.standard, renewalRule: "Month 1 free; months 2-3 R150; from month 4 R750 p/m", visibility: "Card-only lower tier with one image, short summary and direct contact button." },
];

export const accommodationOwnerPackages = [
  {
    tier: "partner" as const,
    label: "MPC Premium Partner Holiday Home",
    publicPrice: "R5,000 p/m if opened later",
    slotLabel: "1 total, currently occupied by Marlotii Safari House",
    summary: "Highest MPC holiday-home position with full showcase presentation and homepage placement.",
  },
  {
    tier: "top-featured" as const,
    label: "MPC Top Featured Holiday Home",
    publicPrice: "Month 1 free; months 2-3 R350; from month 4 R3,500 p/m",
    slotLabel: "5 external positions",
    summary: "Full showcase presentation and homepage eligibility after the Premium Partner.",
  },
  {
    tier: "featured" as const,
    label: "MPC Featured Holiday Home",
    publicPrice: "Month 1 free; months 2-3 R350; from month 4 R2,500 p/m",
    slotLabel: "10 positions",
    summary: "Selected Marloth Park holiday-home listing with useful stay details and direct enquiry access.",
  },
  {
    tier: "standard" as const,
    label: "MPC Listed Holiday Home",
    publicPrice: "Month 1 free; months 2-3 R150; from month 4 R750 p/m",
    slotLabel: "Post-launch only",
    summary: "Card-only listing with one image, short summary and direct contact button.",
  },
];

const tierRank: Record<AccommodationTier, number> = {
  partner: 1,
  "top-featured": 2,
  featured: 3,
  standard: 4,
};

export function sortedAccommodationListings(listings: AccommodationListing[]) {
  return [...listings].sort((a, b) => {
    const tierDelta = tierRank[a.tier] - tierRank[b.tier];
    if (tierDelta !== 0) return tierDelta;
    if (a.homepageEligible !== b.homepageEligible) return a.homepageEligible ? -1 : 1;
    if (a.featured !== b.featured) return a.featured ? -1 : 1;
    if (a.featured !== b.featured) return a.featured ? -1 : 1;
    return a.sortOrder - b.sortOrder || a.name.localeCompare(b.name);
  });
}

export function isPrelaunchAccommodationSlot(listing: Pick<AccommodationListing, "categoryTags">) {
  return (listing.categoryTags || []).some((tag) => String(tag).trim().toLowerCase() === "prelaunch-slot");
}

export function isAccommodationExpiredByDate(listing: AccommodationListing, date = new Date()) {
  const value = String(listing.packageExpiryDate || listing.autoExpireDate || "").trim();
  if (!value) return false;
  const expiry = new Date(`${value.slice(0, 10)}T23:59:59`);
  return Number.isFinite(expiry.getTime()) && expiry.getTime() < date.getTime();
}

export function accommodationImageCount(listing: AccommodationListing) {
  return (listing.images || []).filter((image) => String(image.url || "").trim()).length;
}

export function accommodationHasMinimumImages(listing: AccommodationListing) {
  const minimum = Number.isFinite(Number(listing.minimumImagesRequired)) ? Number(listing.minimumImagesRequired) : 3;
  return accommodationImageCount(listing) >= Math.max(0, minimum);
}

export function isAccommodationPubliclyVisible(listing: AccommodationListing) {
  if (!listing || listing.status !== "active") return false;
  if (isPrelaunchAccommodationSlot(listing)) return false;
  if (isAccommodationExpiredByDate(listing)) return false;
  if (listing.monthlyFeeStatus === "cancelled") return false;
  return true;
}

export function isAccommodationPaidOrApproved(listing: AccommodationListing) {
  return ["paid", "trial", "comped"].includes(String(listing.monthlyFeeStatus || "")) || listing.tier === "standard";
}

export function isAccommodationFeaturedEligible(listing: AccommodationListing) {
  return isAccommodationPubliclyVisible(listing) && isAccommodationPaidOrApproved(listing) && accommodationHasMinimumImages(listing) && (listing.featured || listing.tier === "featured" || listing.tier === "top-featured" || listing.tier === "partner");
}

export function isAccommodationHomepageEligible(listing: AccommodationListing) {
  const homepageTier = listing.tier === "partner" || listing.tier === "top-featured";
  return isAccommodationPubliclyVisible(listing) && isAccommodationPaidOrApproved(listing) && accommodationHasMinimumImages(listing) && homepageTier && Boolean(listing.homepageEligible || listing.partnerBadge || listing.tier === "partner" || listing.tier === "top-featured");
}

export function publicAccommodationListings(listings: AccommodationListing[]) {
  return sortedAccommodationListings((listings || []).filter(isAccommodationPubliclyVisible));
}

export function accommodationPremiumListings(listings: AccommodationListing[]) {
  return publicAccommodationListings(listings).filter((listing) => listing.tier === "partner" || listing.partnerBadge).slice(0, accommodationTierCaps.partner);
}

export function accommodationPriorityListings(listings: AccommodationListing[]) {
  return accommodationPremiumListings(listings);
}

export function accommodationTopFeaturedListings(listings: AccommodationListing[]) {
  const premiumIds = new Set(accommodationPremiumListings(listings).map((listing) => listing.id));
  return publicAccommodationListings(listings)
    .filter((listing) => !premiumIds.has(listing.id) && listing.tier === "top-featured")
    .slice(0, accommodationTierCaps["top-featured"]);
}

export function accommodationFeaturedListings(listings: AccommodationListing[]) {
  const excluded = new Set([
    ...accommodationPremiumListings(listings).map((listing) => listing.id),
    ...accommodationTopFeaturedListings(listings).map((listing) => listing.id),
  ]);
  return publicAccommodationListings(listings)
    .filter((listing) => !excluded.has(listing.id) && (listing.tier === "featured" || listing.featured))
    .slice(0, accommodationTierCaps.featured);
}

export function accommodationBasicListings(listings: AccommodationListing[]) {
  const excluded = new Set([
    ...accommodationPremiumListings(listings).map((listing) => listing.id),
    ...accommodationTopFeaturedListings(listings).map((listing) => listing.id),
    ...accommodationFeaturedListings(listings).map((listing) => listing.id),
  ]);
  return publicAccommodationListings(listings).filter((listing) => !excluded.has(listing.id));
}

export function homepageAccommodationListings(listings: AccommodationListing[]) {
  return [
    ...accommodationPremiumListings(listings),
    ...accommodationTopFeaturedListings(listings),
  ].filter(isAccommodationHomepageEligible).slice(0, 15);
}

export function primaryAccommodationImage(listing: AccommodationListing) {
  return [...(listing.images || [])].sort((a, b) => a.sortOrder - b.sortOrder)[0]?.url || "/images/stay/stay-exterior.webp";
}

export function accommodationBadges(listing: AccommodationListing) {
  const badges: string[] = [accommodationTierLabels[listing.tier]];
  if (listing.tier === "standard") badges.push("Listed on MPC");
  if (listing.featured || listing.tier === "featured" || listing.tier === "top-featured" || listing.tier === "partner") badges.push("Featured visibility");
  if (listing.sleeps) badges.push(`Sleeps ${listing.sleeps}`);
  return Array.from(new Set(badges)).slice(0, 4);
}

// Directory-level helper kept for compatibility with any existing filters.
// During prelaunch, it means enhanced or featured visibility rather than verification.
export function isAccommodationVerifiedForDirectory(listing: AccommodationListing) {
  if (!listing) return false;
  return ["featured", "top-featured", "partner"].includes(listing.tier);
}

export function splitLines(value: string) {
  return value.split(/\r?\n|,/).map((item) => item.trim()).filter(Boolean);
}

export function accommodationLeadEventsForListing(listing: AccommodationListing, events: Array<{ accommodationId?: string; accommodationSlug?: string; supplierId?: string; category?: string; source?: string | null; buttonType?: string; }>) {
  return events.filter((event) => event.accommodationId === listing.id || event.accommodationSlug === listing.slug || event.supplierId === listing.id);
}

export function accommodationClickEventsForListing(listing: AccommodationListing, events: Array<{ accommodationId?: string; accommodationSlug?: string; supplierId?: string; category?: string; buttonType?: string; }>) {
  return accommodationLeadEventsForListing(listing, events).filter((event) => ["email", "map", "website", "booking-link"].includes(String(event.buttonType || "")));
}

export function accommodationEnquiryEventsForListing(listing: AccommodationListing, events: Array<{ accommodationId?: string; accommodationSlug?: string; supplierId?: string; buttonType?: string; source?: string | null; }>) {
  return accommodationLeadEventsForListing(listing, events).filter((event) => event.buttonType === "accommodation-enquiry" || event.source === "accommodation-enquiry-form");
}

export function accommodationViewsForListing(listing: AccommodationListing, events: Array<{ accommodationId?: string; accommodationSlug?: string; supplierId?: string; buttonType?: string; }>) {
  return accommodationLeadEventsForListing(listing, events).filter((event) => event.buttonType === "listing-view");
}

export function accommodationFeaturedImpressionsForListing(listing: AccommodationListing, events: Array<{ accommodationId?: string; accommodationSlug?: string; supplierId?: string; buttonType?: string; }>) {
  return accommodationLeadEventsForListing(listing, events).filter((event) => event.buttonType === "featured-impression");
}

export function recommendedAccommodationNextAction(listing: AccommodationListing, metrics: { views: number; enquiries: number; emailClicks: number; bookingClicks: number; featuredImpressions: number }) {
  if (!isAccommodationPubliclyVisible(listing)) return "Review the listing status before it can appear publicly.";
  if (isAccommodationExpiredByDate(listing)) return "Renew or pause this listing before promoting it.";
  if (!accommodationHasMinimumImages(listing)) return "Add more quality photos before using featured placement.";
  if (metrics.views > 40 && metrics.enquiries === 0) return "Improve the first photo, short description and contact prompt.";
  if (listing.tier === "standard" && metrics.enquiries > 2) return "Consider upgrading this listing to MPC Featured Holiday Home visibility.";
  if ((listing.featured || listing.tier === "featured" || listing.tier === "top-featured") && metrics.featuredImpressions < 20) return "Check featured placement and homepage eligibility.";
  return "Keep details current and renew before the expiry date.";
}
