"use client";

import { useEffect, useState } from "react";
import type { PublicSiteSettings } from "@/lib/settings-shared";
import { defaultSettings } from "@/lib/settings-shared";

export type PublicSettings = Partial<PublicSiteSettings>;

/** Applies logo/favicon/title from admin site settings. */
export function SiteBranding() {
  const settings = usePublicSettings();

  useEffect(() => {
    if (!settings) return;

    if (settings.siteName) {
      const base = document.title.split("·")[0]?.trim() || "BhoFit";
      if (!document.title.includes(settings.siteName)) {
        document.title = document.title.replace(base, settings.siteName);
      }
    }

    const favicon = settings.faviconUrl || defaultSettings.faviconUrl;
    if (favicon) {
      let link = document.querySelector(
        "link[rel='icon']",
      ) as HTMLLinkElement | null;
      if (!link) {
        link = document.createElement("link");
        link.rel = "icon";
        document.head.appendChild(link);
      }
      link.href = favicon;
    }

    if (settings.description) {
      let meta = document.querySelector(
        "meta[name='description']",
      ) as HTMLMetaElement | null;
      if (!meta) {
        meta = document.createElement("meta");
        meta.name = "description";
        document.head.appendChild(meta);
      }
      meta.content = settings.description;
    }
  }, [settings]);

  return null;
}

let cachedSettings: PublicSettings | null = null;
let inflight: Promise<PublicSettings | null> | null = null;

async function fetchPublicSettings(): Promise<PublicSettings | null> {
  if (cachedSettings) return cachedSettings;
  if (!inflight) {
    inflight = fetch("/api/settings/public")
      .then((res) => res.json())
      .then((data: { settings?: PublicSettings }) => {
        cachedSettings = data.settings ?? null;
        return cachedSettings;
      })
      .catch(() => null)
      .finally(() => {
        inflight = null;
      });
  }
  return inflight;
}

export function usePublicSettings() {
  const [settings, setSettings] = useState<PublicSettings | null>(
    cachedSettings ?? {
      logoUrl: defaultSettings.logoUrl,
      faviconUrl: defaultSettings.faviconUrl,
      supportEmail: defaultSettings.supportEmail,
      supportPhone: defaultSettings.supportPhone,
      address: defaultSettings.address,
      siteName: defaultSettings.siteName,
      currency: defaultSettings.currency,
    },
  );
  useEffect(() => {
    void fetchPublicSettings().then((next) => {
      if (next) setSettings({ ...defaultSettings, ...next });
    });
  }, []);
  return settings;
}
