import { Activity } from "../services/workshopService";
import { withCDN } from "@/src/lib/utils";

export interface WorkshopCardUI {
  id: string;
  slug: string;
  ribbon: string;
  borderColor: string;
  iconSrc: string;
  imageSrc: string;
  AiGradientStart?: string;
  AiGradientEnd?: string;
}

export interface MappedWorkshopCard {
  id: string;
  workshopType: string;
  title: string;
  subtitle: string;
  description: string;
  createdFor: string;
  idealForText: string;
  ctaButtonText: string;
  ageRange: string;
  ageText: string;
  durationHeading: string;
  durationText: string;
  lessonDuration: string;
  lessonsTotal: string;
  ribbon: string;
  borderColor: string;
  iconSrc: string;
  imageSrc: string;
  parentActivitiesId?: string | null;
  language?: string | null;
  AiGradientStart?: string;
  AiGradientEnd?: string;
}

/**
 * Hardcoded UI properties for each workshop (slug-based)
 * These contain: ribbon, borderColor, iconSrc, imageSrc
 * Text data comes from API
 */
const WORKSHOP_UI_PROPERTIES: Record<string, WorkshopCardUI> = {
  "SUMMER_CAMP": {
    id: "SUMMER_CAMP",
    slug: "SUMMER_CAMP",
    ribbon: "/Workshop/bg%20%284%29.png",
    borderColor: "#8CC63F",
    iconSrc: "/workshop-logo/logo_camps.svg",
    imageSrc: "/Workshop/photo%20%2812%29.png",
  },
  "BIRTHDAY_PARTIES": {
    id: "BIRTHDAY_PARTIES",
    slug: "BIRTHDAY_PARTIES",
    ribbon: "/Workshop/bg%20%285%29.png",
    borderColor: "#F39000",
    iconSrc: "/workshop-logo/logo_birthday.svg",
    imageSrc: "/Workshop/photo%20%2811%29.png",
  },
  "BUILD_UP": {
    id: "BUILD_UP",
    slug: "BUILD_UP",
    ribbon: "/Workshop/bg%20%286%29.png",
    borderColor: "#15395F",
    iconSrc: "/workshop-logo/logo_build_up.svg",
    imageSrc: "/Workshop/photo%20%2810%29.png",
  },
  "PRO": {
    id: "PRO",
    slug: "PRO",
    ribbon: "/Workshop/bg%20%287%29.png",
    borderColor: "#15395F",
    iconSrc: "/workshop-logo/logo_pro.svg",
    imageSrc: "/Workshop/photo%20%289%29.png",
  },
  "GOLDEN_AGE": {
    id: "GOLDEN_AGE",
    slug: "GOLDEN_AGE",
    ribbon: "/Workshop/bg%20%288%29%20%281%29.png",
    borderColor: "#DBBC47",
    iconSrc: "/workshop-logo/logo_golden_age.svg",
    imageSrc: "/Workshop/photo%20%288%29%20%282%29.png",
  },
  "MECHANICS_CAMPS": {
    id: "MECHANICS_CAMPS",
    slug: "MECHANICS_CAMPS",
    ribbon: "/Workshop/bg%20%284%29.png",
    borderColor: "#226B20",
    iconSrc: "/workshop-logo/logo_camps.svg",
    imageSrc: "https://yefranchisees.b-cdn.net/frontend/discover/mechanic-camp/camps_scroll_photo_3%20(1).png",
    AiGradientStart: "#95C11F",
    AiGradientEnd: "#226B20",
  },
  "CODING_CAMPS": {
    id: "CODING_CAMPS",
    slug: "CODING_CAMPS",
    ribbon: "/Workshop/bg%20%284%29.png",
    borderColor: "#95C11F",
    iconSrc: "/workshop-logo/logo_camps.svg",
    imageSrc: "https://yefranchisees.b-cdn.net/frontend/discover/coding-camp/photo%20(6).png",
    AiGradientStart: "#95C11F",
    AiGradientEnd: "#226B20",
  },
};

/**
 * Normalize the duration value for display.
 * Keeps any unit that comes with it (e.g. "6 Days"), so camps show their
 * day count while minute-based workshops (e.g. "120") stay unchanged.
 */
function extractDurationMinutes(duration: string | number | null | undefined): string {
  if (duration === null || duration === undefined) return "";
  return String(duration).trim();
}

/**
 * Extract age range from age text
 * Example: "2-5" -> "2-5", "55+" -> "55+"
 */
function extractAgeRange(age: string): string {
  if (!age) return "";
  return age.trim();
}

/**
 * Slug is now simple and fixed.
 * Checks for base names like 'build-up', 'camps', 'pro', 'golden-age', 'birthday-parties'
 */
function extractBaseSlug(slug: string | null): string | null {
  if (!slug) return null;
  
  const s = slug.toLowerCase();
  if (s.includes("coding_camps")) return "CODING_CAMPS";
  if (s.includes("mechanics_camps")) return "MECHANICS_CAMPS";
  if (s.includes("build_up")) return "BUILD_UP";
  if (s.includes("summer_camp")) return "SUMMER_CAMP";
  if (s.includes("pro")) return "PRO";
  if (s.includes("golden_age")) return "GOLDEN_AGE";
  if (s.includes("birthday_parties")) return "BIRTHDAY_PARTIES";

  return null;
}

/**
 * Map a single Activity from API to WorkshopCard format
 */
export function mapActivityToWorkshopCard(activity: Activity): MappedWorkshopCard | null {
  const baseSlug = extractBaseSlug(activity.slug);

  // Skip activity if slug doesn't match any known base slugs
  if (!baseSlug) {
    return null;
  }

  const uiProps = WORKSHOP_UI_PROPERTIES[baseSlug];
  if (!uiProps) {
    return null;
  }
  
  const { activity_details: details } = activity;

  // Use API image if available, with fallback to static
  const apiImage = details?.image && details.image.trim() !== "" ? details.image : null;

  return {
    id: activity.id,  // Use actual API ID for navigation
    workshopType: baseSlug,
    title: activity.title || "",
    subtitle: details?.activity_heading || "",
    description: details?.activity_description || "",
    createdFor: details?.created_for ? `${details.created_for}` : "",
    idealForText: details?.ideal_for_text?.trim() || "Ideal FOR:",
    ctaButtonText: details?.cta_button?.text?.trim() || "BOOK NOW",
    ageRange: extractAgeRange(details?.age),
    ageText: details?.age_text || "",
    durationHeading: details?.duration_heading || "Duration",
    durationText: details?.duration_text || "",
    lessonDuration: extractDurationMinutes(details?.duration),
    lessonsTotal: "",
    ribbon: uiProps.ribbon,
    borderColor: uiProps.borderColor,
    iconSrc: activity.activity_icon ? withCDN(activity.activity_icon) : uiProps.iconSrc,
    // API image takes priority; fallback to static CDN path
    imageSrc: apiImage || uiProps.imageSrc,
    parentActivitiesId: activity.parent_activities_id,
    language: activity.language,
    AiGradientStart: uiProps.AiGradientStart || "#95C11F",
    AiGradientEnd: uiProps.AiGradientEnd || "#226B20",
  };
}

/**
 * Map multiple Activities from API to WorkshopCard format
 * Filters out activities that don't have UI properties defined
 */
export function mapActivitiesToWorkshopCards(activities: Activity[]): MappedWorkshopCard[] {
  if (!Array.isArray(activities)) return [];

  return activities
    .map((activity) => mapActivityToWorkshopCard(activity))
    .filter((card): card is MappedWorkshopCard => card !== null);
}