import { cookies } from "next/headers";

import Footer from "@/components/common/footer";
import ClientNavbar from "@/components/pages/client/common/client-navbar";
import AnnouncementBanner from "@/components/pages/client/home/announcement-banner";
import CredentialsAndCertifications from "@/components/pages/client/home/credentials-certifications";
import Insights from "@/components/pages/client/home/insights";
import OurCommunity from "@/components/pages/client/home/our-community";
import Resources from "@/components/pages/client/home/resources";
import UserViewingHero from "@/components/pages/client/home/uv-hero";
import WhatWeDo from "@/components/pages/client/home/what-we-do";
import WhyUs from "@/components/pages/client/home/why-us";
import InitialHero from "@/components/pages/client/home/initial-hero";
import UnderMaintenanceBanner from "@/components/pages/participant/under-maintenance-banner";
import { InternalClientBlogTags } from "@/constants/blog-data";
import { fetchPostsByTag } from "@/services/blogActions";
import { COOKIE_UNDER_MAINTENANCE_BANNER } from "@/constants/cookie-mapping";
import { loadHomepageContent } from "@/lib/homepage-ghost-content";
import { generateRandomImage } from "@/utils/generate-random-image";

export default async function Homepage() {
  const [homepageContent, recentPosts] = await Promise.all([
    loadHomepageContent(),
    fetchPostsByTag(
      Object.values(InternalClientBlogTags).map((tag) => `#${tag}`),
      5,
      { timeoutMs: 5000 },
    ).catch(() => ({ posts: [] })),
  ]);
  const heroImage = generateRandomImage("client");

  const startDate = process.env.UNDER_MAINTENANCE_BANNER_START_DATE;
  const endDate = process.env.UNDER_MAINTENANCE_BANNER_END_DATE;
  const isSiteBlocked =
    process.env.UNDER_MAINTENANCE_ALLOW_CLIENT_WEBSITE === "true";

  const isMaintenanceWindow = (() => {
    if (isSiteBlocked) return true;
    if (!startDate || !endDate) return false;
    const now = new Date();
    return now >= new Date(startDate) && now <= new Date(endDate);
  })();

  const cookieStore = cookies();
  const dismissed = cookieStore.get(COOKIE_UNDER_MAINTENANCE_BANNER)?.value;
  const showBanner = isMaintenanceWindow && dismissed !== endDate;

  const { announcement, hero, whyUs, userViewing } = homepageContent;
  const now = new Date();
  const showAnnouncementBanner =
    !isMaintenanceWindow && now >= announcement.start && now < announcement.end;

  const formattedDate = endDate
    ? new Date(endDate).toLocaleDateString("en-GB", {
        weekday: "long",
        day: "numeric",
        month: "long",
      })
    : "";

  const formattedTime = endDate
    ? new Date(endDate).toLocaleTimeString("en-GB", {
        hour: "numeric",
        minute: "2-digit",
        hour12: true,
      })
    : "";

  return (
    <div className="flex flex-col min-h-screen bg-others-mistyGray dark:bg-jet">
      {showBanner && (
        <UnderMaintenanceBanner
          endDate={endDate!}
          formattedDate={formattedDate}
          formattedTime={formattedTime}
        />
      )}
      {showAnnouncementBanner && (
        <AnnouncementBanner
          content={{
            message: announcement.message,
            linkLabel: announcement.linkLabel,
          }}
        />
      )}
      <ClientNavbar />
      <main className="flex-grow" id="main-content">
        <InitialHero content={hero} randomImage={heroImage} />
        <WhyUs content={whyUs} />
        <WhatWeDo />
        <OurCommunity />
        <Insights recentPosts={recentPosts.posts} />
        <Resources />
        <UserViewingHero content={userViewing} />
        <CredentialsAndCertifications />
      </main>
      <Footer source="client" />
    </div>
  );
}
