import { useEffect, useMemo, useRef, useState } from "react";
import Head from "next/head";
import Image from "next/image";
import Link from "next/link";
import { useRouter } from "next/router";
import { useTranslation } from "next-i18next";
import { serverSideTranslations } from "next-i18next/serverSideTranslations";
import type { GetServerSideProps } from "next";
import i18nConfig from "../../../../next-i18next.config";
import { Modal } from "antd";
import {
  ChevronLeft,
  ChevronRight,
  MapPin,
  Clock,
  CalendarDays,
  ArrowRight,
  ChevronDown,
  ImageIcon,
  Handshake,
  Landmark,
  Globe,
  Users,
  Mic,
  Ticket,
  BarChart3,
  X,
} from "lucide-react";
import {
  type PastEventHighlight,
  type UpcomingEvent,
} from "@/lib/expatContent";
import { getUpcomingEvents, getPastEventHighlights } from "@/lib/webflowEvents";
import CollaborateForm from "@/components/expat/collaborateForm";
import { formatDateWithWeekday as fmtDate } from "@/lib/formatDate";

const PAGE_SIZE = 3;

const collabTypes = [
  { key: "sponsorship", icon: Handshake },
  { key: "venue", icon: Landmark },
  { key: "activities", icon: Globe },
  { key: "co-hosted", icon: Users },
  { key: "speaker", icon: Mic },
] as const;

const checklistItems = [
  { icon: Globe, badgeClass: "bg-sky-50 text-sky-500" },
  { icon: CalendarDays, badgeClass: "bg-rose-50 text-rose-500" },
  { icon: Handshake, badgeClass: "bg-amber-50 text-amber-600" },
  { icon: BarChart3, badgeClass: "bg-emerald-50 text-emerald-600" },
] as const;

type Props = {
  upcomingEvents: UpcomingEvent[];
  pastEventHighlights: PastEventHighlight[];
};

export default function ExpatEventsPage({
  upcomingEvents,
  pastEventHighlights,
}: Props) {
  const router = useRouter();
  const { t, i18n } = useTranslation("expat");
  const lang = i18n.language || router.locale || "en";
  const isEn = lang === "en";

  const [activeCategory, setActiveCategory] = useState<string | "all">("all");
  const [visibleCount, setVisibleCount] = useState(PAGE_SIZE);
  const [selectedHighlight, setSelectedHighlight] =
    useState<PastEventHighlight | null>(null);
  const [selectedEvent, setSelectedEvent] = useState<UpcomingEvent | null>(
    null,
  );

  const galleryScrollRef = useRef<HTMLDivElement>(null);
  const [gallerySlide, setGallerySlide] = useState(0);

  const gallerySlides = useMemo(() => {
    if (!selectedHighlight) return [];
    const all = [
      selectedHighlight.image,
      ...(selectedHighlight.gallery ?? []),
    ].filter((src): src is string => !!src);
    return Array.from(new Set(all));
  }, [selectedHighlight]);

  useEffect(() => {
    setGallerySlide(0);
    galleryScrollRef.current?.scrollTo({ left: 0 });
  }, [selectedHighlight]);

  const scrollToGallerySlide = (index: number) => {
    const el = galleryScrollRef.current;
    if (!el) return;
    const clamped = Math.max(0, Math.min(index, gallerySlides.length - 1));
    el.scrollTo({ left: clamped * el.clientWidth, behavior: "smooth" });
  };

  // Categories come straight from whatever each Webflow event was tagged
  // with — no fixed list, so the filter pills are just the distinct set
  // actually present, in first-seen order.
  const categories = useMemo(
    () =>
      Array.from(
        new Set(pastEventHighlights.map((h) => h.category).filter(Boolean)),
      ),
    [pastEventHighlights],
  );

  const filteredHighlights = useMemo(
    () =>
      activeCategory === "all"
        ? pastEventHighlights
        : pastEventHighlights.filter((h) => h.category === activeCategory),
    [activeCategory, pastEventHighlights],
  );
  const visibleHighlights = filteredHighlights.slice(0, visibleCount);
  const hasMore = visibleCount < filteredHighlights.length;

  return (
    <div className="relative min-h-screen overflow-x-hidden bg-bgBrand">
      <Head>
        <title>{t("events.meta.title")}</title>
        <meta name="description" content={t("events.meta.description")} />
      </Head>

      {/* Hero */}
      <section className="relative overflow-hidden bg-gradient-to-br from-[#051973] via-[#0b3e98] to-[#00B6FF] px-4 pb-16 pt-8 sm:px-6 lg:px-24">
        <Image
          aria-hidden
          src="/images/bubble2.svg"
          alt=""
          width={218}
          height={217}
          className="pointer-events-none absolute -top-8 right-4 z-0 h-[320px] w-[320px] blur-3xl sm:right-16 sm:h-[380px] sm:w-[380px] lg:right-32"
        />
        <Image
          aria-hidden
          src="/images/bubble.svg"
          alt=""
          width={150}
          height={117}
          className="pointer-events-none absolute top-28 right-0 z-0 h-[220px] w-[220px] blur-3xl sm:right-8 sm:h-[260px] sm:w-[260px] lg:right-20"
        />

        <nav className="relative z-10 flex items-center gap-2 pt-6 text-xs text-white/70 sm:text-sm">
          <Link
            href="/expat"
            className="inline-flex items-center gap-1 hover:text-white"
          >
            <ChevronLeft className="h-3.5 w-3.5" />
            {t("events.breadcrumbHome")}
          </Link>
          <span>/</span>
          <span className="text-white">{t("events.breadcrumbCurrent")}</span>
        </nav>

        <div className="relative z-10 mt-10 max-w-2xl pb-6 sm:left-5 lg:left-24">
          <span className="inline-block rounded-full border border-white/30 bg-white/10 px-3 py-1 text-xs font-semibold text-white backdrop-blur">
            {t("events.hero.badge")}
          </span>
          <h1 className="mt-4 text-3xl font-extrabold leading-tight text-white sm:text-4xl md:text-5xl">
            {t("events.hero.title1")}
            <br />
            {t("events.hero.title2")}
          </h1>
          <p className="mt-3 text-sm text-white/80 sm:text-base">
            {t("events.hero.subtitle")}
          </p>
        </div>
      </section>

      {/* Join Us Next */}
      <section className="bg-bgBrand px-4 py-16 sm:px-6 lg:px-24">
        <div className="mx-auto max-w-6xl">
          <span className="inline-block rounded-full border border-border bg-white px-3 py-1 text-xs font-semibold text-main">
            {t("events.joinUsNext.badge")}
          </span>
          <h2 className="mt-3 text-2xl font-extrabold text-main sm:text-4xl">
            {t("events.joinUsNext.title")}
          </h2>

          {upcomingEvents.length > 0 ? (
            <div
              className={`mt-8 grid grid-cols-1 gap-6 ${
                upcomingEvents.length >= 3
                  ? "sm:grid-cols-2 lg:grid-cols-3"
                  : "sm:grid-cols-2"
              }`}
            >
              {upcomingEvents.map((event) => (
                <article
                  key={event.slug}
                  role="button"
                  tabIndex={0}
                  onClick={() => setSelectedEvent(event)}
                  onKeyDown={(e) => {
                    if (e.key === "Enter" || e.key === " ") {
                      e.preventDefault();
                      setSelectedEvent(event);
                    }
                  }}
                  className="flex cursor-pointer flex-col overflow-hidden rounded-2xl bg-white shadow-xl transition hover:shadow-2xl focus:outline-none focus-visible:ring-2 focus-visible:ring-[#051973]"
                >
                  <div className="relative flex h-40 items-end overflow-hidden bg-gradient-to-br from-[#12224f] via-[#1b3a86] to-[#00B6FF] sm:h-48">
                    {event.image && (
                      <Image
                        src={event.image}
                        alt={isEn ? event.title_en : event.title_mn}
                        fill
                        className="object-cover"
                      />
                    )}
                    <span className="absolute left-4 top-4 inline-flex items-center gap-1 rounded-full bg-emerald-500 px-2.5 py-1 text-[11px] font-semibold text-white">
                      {event.status === "open"
                        ? t("events.joinUsNext.open")
                        : t("events.joinUsNext.full")}
                    </span>
                    <div className="pointer-events-none absolute inset-0 bg-gradient-to-t from-black/60 via-transparent to-transparent" />
                    <span className="relative m-4 inline-flex items-center gap-1 text-xs font-medium text-white">
                      <MapPin className="h-3.5 w-3.5" />
                      {isEn ? event.city_en : event.city_mn}
                    </span>
                  </div>

                  <div className="flex flex-1 flex-col p-5 sm:p-6">
                    <div className="flex flex-wrap items-center gap-3 text-xs font-medium text-gray-500">
                      <span className="inline-flex items-center gap-1">
                        <CalendarDays className="h-3.5 w-3.5" />
                        {fmtDate(event.date, isEn)}
                      </span>
                      <span className="inline-flex items-center gap-1">
                        <Clock className="h-3.5 w-3.5" />
                        {event.timeStart}–{event.timeEnd}
                      </span>
                    </div>

                    <h3 className="mt-3 text-lg font-bold leading-snug text-[#051973]">
                      {isEn ? event.title_en : event.title_mn}
                    </h3>
                    <p className="mt-1 inline-flex items-center gap-1 text-sm text-gray-500">
                      <MapPin className="h-3.5 w-3.5" />
                      {isEn ? event.venue_en : event.venue_mn}
                    </p>
                    <p className="mt-3 text-sm text-gray-600">
                      {(isEn ? event.desc_en : event.desc_mn).split("\n")[0]}
                    </p>

                    <Link
                      href={event.registerUrl ?? "#"}
                      target={event.registerUrl ? "_blank" : undefined}
                      rel="noopener noreferrer"
                      onClick={(e) => e.stopPropagation()}
                      className="mt-6 inline-flex items-center justify-center gap-2 rounded-xl bg-[#051973] px-5 py-3 text-sm font-semibold text-white transition hover:brightness-110"
                    >
                      {t("events.joinUsNext.registerNow")}
                    </Link>
                  </div>
                </article>
              ))}
            </div>
          ) : (
            <p className="mt-8 text-sm text-gray-500">
              {t("events.joinUsNext.empty")}
            </p>
          )}
        </div>
      </section>

      {/* Highlights & Memories */}
      <section className="bg-gradient-to-b from-[#eef9fb] to-white px-4 py-16 sm:px-6 lg:px-24">
        <div className="mx-auto max-w-6xl">
          <span className="inline-block rounded-full border border-border bg-white px-3 py-1 text-xs font-bold text-main">
            {t("events.highlights.badge")}
          </span>
          <h2 className="mt-3 text-2xl font-extrabold text-main sm:text-4xl">
            {t("events.highlights.title")}
          </h2>

          <div className="mt-6 flex flex-wrap gap-2">
            <button
              onClick={() => {
                setActiveCategory("all");
                setVisibleCount(PAGE_SIZE);
              }}
              className={`rounded-full px-4 py-2 text-sm font-semibold transition ${
                activeCategory === "all"
                  ? "bg-[#051973] text-white"
                  : "border border-border bg-white text-main hover:bg-blue-50"
              }`}
            >
              {t("events.highlights.all")}
            </button>
            {categories.map((cat) => (
              <button
                key={cat}
                onClick={() => {
                  setActiveCategory(cat);
                  setVisibleCount(PAGE_SIZE);
                }}
                className={`rounded-full px-4 py-2 text-sm font-semibold transition ${
                  activeCategory === cat
                    ? "bg-[#051973] text-white"
                    : "border border-border bg-white text-main hover:bg-blue-50"
                }`}
              >
                {cat}
              </button>
            ))}
          </div>

          <div className="mt-8 grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3">
            {visibleHighlights.map((h) => (
              <button
                type="button"
                key={h.slug}
                onClick={() => setSelectedHighlight(h)}
                className="group relative flex h-64 w-full flex-col justify-end overflow-hidden rounded-2xl bg-gradient-to-br from-[#12224f] via-[#3a3a8f] to-[#8a5fd6] p-5 text-left text-white shadow-sm transition hover:brightness-110"
              >
                {h.image ? (
                  <Image
                    src={h.image}
                    alt={isEn ? h.title_en : h.title_mn}
                    fill
                    className="object-cover"
                  />
                ) : (
                  <ImageIcon className="absolute right-4 top-4 h-5 w-5 text-white/30" />
                )}
                <div className="pointer-events-none absolute inset-0 bg-gradient-to-t from-black/70 via-black/10 to-transparent" />
                <div className="relative">
                  <p className="text-[11px] font-medium uppercase tracking-wide text-white/60">
                    {fmtDate(h.date, isEn)}
                  </p>
                  <h3 className="mt-1 text-base font-bold leading-snug">
                    {isEn ? h.title_en : h.title_mn}
                  </h3>
                  <span className="mt-3 inline-flex items-center gap-1 text-xs font-semibold text-[#7CE7FF]">
                    {t("events.highlights.viewHighlights", {
                      count: h.highlightsCount,
                    })}
                    <ArrowRight className="h-3.5 w-3.5" />
                  </span>
                </div>
              </button>
            ))}
          </div>

          {filteredHighlights.length === 0 && (
            <p className="mt-10 text-center text-sm text-gray-500">
              {t("events.highlights.empty")}
            </p>
          )}

          {hasMore && (
            <div className="mt-10 flex justify-center">
              <button
                onClick={() => setVisibleCount((c) => c + PAGE_SIZE)}
                className="inline-flex items-center gap-2 rounded-xl border border-[#051973] px-5 py-2.5 text-sm font-semibold text-[#051973] transition hover:bg-blue-50"
              >
                {t("events.highlights.loadMore")}
                <ChevronDown className="h-4 w-4" />
              </button>
            </div>
          )}
        </div>
      </section>

      {/* Partner With the Community */}
      <section className="bg-gradient-to-b from-[#eef9fb] to-white px-4 py-16 sm:px-6 lg:px-24">
        <div className="mx-auto max-w-6xl">
          <span className="inline-block rounded-full border border-border bg-white px-3 py-1 text-xs font-semibold text-main">
            Collaborate With Us
          </span>
          <h2 className="mt-3 max-w-lg text-2xl font-extrabold text-main sm:text-4xl">
            {t("events.partner.title1")}
            <br />
            {t("events.partner.title2")}
          </h2>
          <p className="mt-3 max-w-2xl text-sm text-gray-600 sm:text-base">
            {t("events.partner.desc")}
          </p>

          <div className="mt-10 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3">
            {collabTypes.map(({ key, icon: Icon }) => (
              <div
                key={key}
                className="rounded-2xl border border-border bg-white p-5 text-left shadow-sm"
              >
                <div className="grid h-10 w-10 place-items-center rounded-xl bg-bgBrand text-[#051973] shadow-sm">
                  <Icon className="h-5 w-5" />
                </div>
                <h3 className="mt-3 text-sm font-bold text-[#051973]">
                  {t(`events.partner.collabTypes.${key}.title`)}
                </h3>
                <p className="mt-1 text-xs text-gray-600">
                  {t(`events.partner.collabTypes.${key}.desc`)}
                </p>
              </div>
            ))}
          </div>

          <div className="mt-14 grid grid-cols-1 gap-10 lg:grid-cols-2">
            <div>
              <h3 className="text-lg font-bold text-main sm:text-xl">
                {t("events.partner.ideaTitle")}
              </h3>
              <p className="mt-2 text-sm text-gray-600">
                {t("events.partner.ideaDesc")}
              </p>

              <ul className="mt-6 space-y-3">
                {checklistItems.map(({ icon: Icon, badgeClass }, i) => (
                  <li
                    key={i}
                    className="flex items-center gap-3 text-sm text-gray-700"
                  >
                    <span
                      className={`grid h-8 w-8 shrink-0 place-items-center rounded-full ${badgeClass}`}
                    >
                      <Icon className="h-4 w-4" />
                    </span>
                    {t(`events.partner.checklist.item${i + 1}`)}
                  </li>
                ))}
              </ul>
            </div>

            <CollaborateForm />
          </div>
        </div>
      </section>

      {/* Highlight detail popup */}
      <Modal
        open={!!selectedHighlight}
        onCancel={() => setSelectedHighlight(null)}
        footer={null}
        centered
        width={680}
        closeIcon={
          <span className="grid h-8 w-8 place-items-center rounded-full bg-black/40 backdrop-blur-sm transition hover:bg-black/60">
            <X className="h-4 w-4 text-white" />
          </span>
        }
        styles={{
          content: { padding: 0, borderRadius: 20, overflow: "hidden" },
        }}
      >
        {selectedHighlight && (
          <>
            <div className="relative">
              {gallerySlides.length > 0 ? (
                <div
                  ref={galleryScrollRef}
                  onScroll={(e) => {
                    const el = e.currentTarget;
                    if (el.clientWidth === 0) return;
                    setGallerySlide(Math.round(el.scrollLeft / el.clientWidth));
                  }}
                  className="flex h-64 snap-x snap-mandatory overflow-x-auto scroll-smooth sm:h-80 [-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden"
                >
                  {gallerySlides.map((src, i) => (
                    <div
                      key={`${i}-${src}`}
                      className="relative h-full w-full shrink-0 snap-start overflow-hidden bg-gradient-to-br from-[#12224f] via-[#3a3a8f] to-[#8a5fd6]"
                    >
                      <Image
                        src={src}
                        alt={`${
                          isEn
                            ? selectedHighlight.title_en
                            : selectedHighlight.title_mn
                        } ${i + 1}`}
                        fill
                        className="object-cover"
                        priority={i === 0}
                        loading={i === 0 ? undefined : "eager"}
                        sizes="(max-width: 640px) 100vw, 680px"
                      />
                    </div>
                  ))}
                </div>
              ) : (
                <div className="relative flex h-64 items-center justify-center overflow-hidden bg-gradient-to-br from-[#12224f] via-[#3a3a8f] to-[#8a5fd6] sm:h-80">
                  <ImageIcon className="h-8 w-8 text-white/40" />
                </div>
              )}

              <div className="pointer-events-none absolute inset-0 flex flex-col justify-end bg-gradient-to-t from-black/60 via-transparent to-transparent p-5">
                <p className="text-[11px] font-medium uppercase tracking-wide text-white/70">
                  {fmtDate(selectedHighlight.date, isEn)}
                </p>
                <h3 className="mt-1 text-xl font-bold leading-snug text-white">
                  {isEn
                    ? selectedHighlight.title_en
                    : selectedHighlight.title_mn}
                </h3>
              </div>

              {gallerySlides.length > 1 && (
                <>
                  <button
                    type="button"
                    onClick={() => scrollToGallerySlide(gallerySlide - 1)}
                    className="absolute left-4 top-1/2 grid h-9 w-9 -translate-y-1/2 place-items-center rounded-full bg-white/90 text-[#051973] shadow-md transition hover:bg-white disabled:pointer-events-none disabled:opacity-0"
                    disabled={gallerySlide <= 0}
                    aria-label={t("events.detailModal.prevImage")}
                  >
                    <ChevronLeft className="h-5 w-5" />
                  </button>
                  <button
                    type="button"
                    onClick={() => scrollToGallerySlide(gallerySlide + 1)}
                    className="absolute right-4 top-1/2 grid h-9 w-9 -translate-y-1/2 place-items-center rounded-full bg-white/90 text-[#051973] shadow-md transition hover:bg-white disabled:pointer-events-none disabled:opacity-0"
                    disabled={gallerySlide >= gallerySlides.length - 1}
                    aria-label={t("events.detailModal.nextImage")}
                  >
                    <ChevronRight className="h-5 w-5" />
                  </button>
                  <div className="pointer-events-none absolute bottom-4 left-1/2 flex -translate-x-1/2 gap-1.5">
                    {gallerySlides.map((_, i) => (
                      <span
                        key={i}
                        className={`h-1.5 rounded-full transition-all ${
                          i === gallerySlide
                            ? "w-5 bg-white"
                            : "w-1.5 bg-white/50"
                        }`}
                      />
                    ))}
                  </div>
                </>
              )}
            </div>

            {gallerySlides.length > 1 && (
              <div className="flex gap-2 overflow-x-auto border-b border-border bg-white p-4 [-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden">
                {gallerySlides.map((src, i) => (
                  <button
                    key={`${i}-${src}`}
                    type="button"
                    onClick={() => scrollToGallerySlide(i)}
                    aria-label={t("events.detailModal.viewImage", {
                      index: i + 1,
                    })}
                    className={`relative h-16 w-16 shrink-0 overflow-hidden rounded-lg transition ${
                      i === gallerySlide
                        ? "ring-2 ring-[#051973] ring-offset-2"
                        : "opacity-60 hover:opacity-100"
                    }`}
                  >
                    <Image
                      src={src}
                      alt=""
                      fill
                      className="object-cover"
                      loading="eager"
                      sizes="64px"
                    />
                  </button>
                ))}
              </div>
            )}

            <div className="p-6 sm:p-8">
              <div className="flex flex-wrap items-center gap-2">
                {selectedHighlight.category && (
                  <span className="inline-block rounded-full border border-border bg-bgBrand px-3 py-1 text-xs font-semibold text-main">
                    {selectedHighlight.category}
                  </span>
                )}
                {selectedHighlight.highlightsCount > 0 && (
                  <span className="inline-flex items-center gap-1 rounded-full bg-[#eef4ff] px-3 py-1 text-xs font-semibold text-[#051973]">
                    <ImageIcon className="h-3.5 w-3.5" />
                    {t("events.detailModal.highlights", {
                      count: selectedHighlight.highlightsCount,
                    })}
                  </span>
                )}
              </div>

              {(() => {
                const detailBody = isEn
                  ? selectedHighlight.detailBody_en
                  : selectedHighlight.detailBody_mn;
                if (detailBody && detailBody.length > 0) {
                  return (
                    <div className="mt-4 space-y-3">
                      {detailBody.map((para, i) => (
                        <p
                          key={i}
                          className="text-sm text-gray-600 sm:text-base"
                        >
                          {para}
                        </p>
                      ))}
                    </div>
                  );
                }
                return (
                  <p className="mt-4 text-sm text-gray-600 sm:text-base">
                    {isEn
                      ? selectedHighlight.desc_en
                      : selectedHighlight.desc_mn}
                  </p>
                );
              })()}

              <button
                type="button"
                onClick={() => setSelectedHighlight(null)}
                className="mt-6 inline-flex items-center justify-center rounded-xl bg-[#051973] px-5 py-2.5 text-sm font-semibold text-white transition hover:brightness-110"
              >
                {t("events.detailModal.close")}
              </button>
            </div>
          </>
        )}
      </Modal>

      {/* Upcoming event detail popup */}
      <Modal
        open={!!selectedEvent}
        onCancel={() => setSelectedEvent(null)}
        footer={null}
        centered
        width={720}
        closeIcon={
          <span className="grid h-8 w-8 place-items-center rounded-full bg-black/40 backdrop-blur-sm transition hover:bg-black/60">
            <X className="h-4 w-4 text-white" />
          </span>
        }
        styles={{
          content: { padding: 0, borderRadius: 20, overflow: "hidden" },
          body: { maxHeight: "82vh", overflowY: "auto" },
        }}
      >
        {selectedEvent && (
          <>
            {/* Banner */}
            <div className="relative flex h-60 flex-col justify-end overflow-hidden bg-gradient-to-br from-[#12224f] via-[#1b3a86] to-[#00B6FF] p-5 sm:h-80">
              {selectedEvent.image && (
                <Image
                  src={selectedEvent.image}
                  alt={isEn ? selectedEvent.title_en : selectedEvent.title_mn}
                  fill
                  className="object-cover"
                />
              )}
              <span className="absolute left-5 top-5 inline-flex items-center gap-1 rounded-full bg-emerald-500 px-2.5 py-1 text-[11px] font-semibold text-white">
                {selectedEvent.status === "open"
                  ? t("events.eventModal.openForRegistration")
                  : t("events.eventModal.registrationClosed")}
              </span>
              <div className="pointer-events-none absolute inset-0 bg-gradient-to-t from-black/70 via-black/10 to-transparent" />
              <div className="relative">
                <h3 className="text-lg font-bold leading-snug text-white sm:text-xl">
                  {isEn ? selectedEvent.title_en : selectedEvent.title_mn}
                </h3>
                <p className="mt-1 inline-flex items-center gap-1 text-xs text-white/80">
                  <MapPin className="h-3.5 w-3.5" />
                  {isEn ? selectedEvent.city_en : selectedEvent.city_mn}
                </p>
              </div>
            </div>

            <div className="p-5 sm:p-7">
              {/* Info cards */}
              <div className="grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3">
                <InfoCard
                  icon={<CalendarDays className="h-3.5 w-3.5" />}
                  label={t("events.eventModal.date")}
                  value={fmtDate(selectedEvent.date, isEn)}
                />
                <InfoCard
                  icon={<Clock className="h-3.5 w-3.5" />}
                  label={t("events.eventModal.time")}
                  value={`${selectedEvent.timeStart}–${selectedEvent.timeEnd}`}
                />
                <InfoCard
                  icon={<MapPin className="h-3.5 w-3.5" />}
                  label={t("events.eventModal.location")}
                  value={isEn ? selectedEvent.venue_en : selectedEvent.venue_mn}
                />
                {(isEn
                  ? selectedEvent.organizer_en
                  : selectedEvent.organizer_mn) && (
                  <InfoCard
                    icon={<Users className="h-3.5 w-3.5" />}
                    label={t("events.eventModal.organizer")}
                    value={
                      (isEn
                        ? selectedEvent.organizer_en
                        : selectedEvent.organizer_mn) as string
                    }
                  />
                )}
                {(isEn ? selectedEvent.price_en : selectedEvent.price_mn) && (
                  <InfoCard
                    icon={<Ticket className="h-3.5 w-3.5" />}
                    label={t("events.eventModal.price")}
                    value={
                      (isEn
                        ? selectedEvent.price_en
                        : selectedEvent.price_mn) as string
                    }
                  />
                )}
                {selectedEvent.capacity && (
                  <InfoCard
                    icon={<Users className="h-3.5 w-3.5" />}
                    label={t("events.eventModal.capacity")}
                    value={selectedEvent.capacity}
                  />
                )}
              </div>

              {/* About */}
              {(isEn ? selectedEvent.desc_en : selectedEvent.desc_mn) && (
                <div className="mt-6">
                  <h4 className="text-sm font-bold text-[#051973]">
                    {t("events.eventModal.about")}
                  </h4>
                  <div className="mt-2 space-y-3">
                    {(isEn ? selectedEvent.desc_en : selectedEvent.desc_mn)
                      .split("\n")
                      .filter(Boolean)
                      .map((para, i) => (
                        <p key={i} className="text-sm text-gray-600">
                          {para}
                        </p>
                      ))}
                  </div>
                </div>
              )}

              {/* Agenda */}
              {(() => {
                const agenda = selectedEvent.agenda;
                if (!agenda || agenda.length === 0) return null;
                return (
                  <div className="mt-6">
                    <h4 className="text-sm font-bold text-[#051973]">
                      {t("events.eventModal.agenda")}
                    </h4>
                    <ul className="mt-3 space-y-3 border-l-2 border-[#19D2FF] pl-4">
                      {agenda.map((item, i) => (
                        <li key={i} className="relative text-sm text-gray-600">
                          <span className="absolute -left-[21px] top-1.5 h-2 w-2 rounded-full bg-[#19D2FF]" />
                          {item.time && (
                            <span className="font-semibold text-[#051973]">
                              {item.time}
                            </span>
                          )}
                          {item.time ? " — " : ""}
                          {isEn ? item.label_en : item.label_mn}
                        </li>
                      ))}
                    </ul>
                  </div>
                );
              })()}

              <Link
                href={selectedEvent.registerUrl ?? "#"}
                target={selectedEvent.registerUrl ? "_blank" : undefined}
                rel="noopener noreferrer"
                className="mt-7 inline-flex w-full items-center justify-center gap-2 rounded-xl bg-[#051973] px-6 py-3 text-sm font-semibold text-white transition hover:brightness-110"
              >
                {t("events.eventModal.register")}
                <ArrowRight className="h-4 w-4" />
              </Link>
            </div>
          </>
        )}
      </Modal>
    </div>
  );
}

function InfoCard({
  icon,
  label,
  value,
}: {
  icon: React.ReactNode;
  label: string;
  value: string;
}) {
  return (
    <div className="rounded-xl bg-bgBrand p-3">
      <span className="inline-flex items-center gap-1 text-[11px] font-medium text-gray-500">
        {icon}
        {label}
      </span>
      <p className="mt-1 text-sm font-semibold text-[#051973]">{value}</p>
    </div>
  );
}

export const getServerSideProps: GetServerSideProps<Props> = async ({
  locale,
}) => {
  const [upcomingEvents, pastEventHighlights] = await Promise.all([
    getUpcomingEvents(),
    getPastEventHighlights(),
  ]);

  return {
    props: {
      upcomingEvents,
      pastEventHighlights,
      ...(await serverSideTranslations(
        locale ?? "en",
        ["common", "expat"],
        i18nConfig,
      )),
    },
  };
};
