import { Metadata } from "next";
import { headers } from "next/headers";
import { fetchPageData } from "@/services/api";

// SEO properties (supports title, description, keywords, canonical, image, etc.)
export interface CreateSeoParams {
    title?: string;
    seo_title?: string;
    description?: string;
    seo_description?: string;
    keywords?: string | string[];
    seo_keywords?: string | string[];
    canonical?: string;
    path?: string;
    image?: string;
    og_image?: string;
    seo_image?: string;
    robots?: string | Record<string, any>;
    [key: string]: any;
}

export type SeoData = CreateSeoParams;

export async function getSiteUrl(): Promise<string> {
    // 1. Environment variable override (.env file)
    if (process.env.NEXT_PUBLIC_SITE_URL) {
        return process.env.NEXT_PUBLIC_SITE_URL.replace(/\/$/, "");
    }

    // 2. Dynamic request header detection (localhost, staging, production)
    try {
        const headerList = await headers();
        const host = headerList.get("host");
        if (host) {
            const isLocal = host.includes("localhost") || host.includes("127.0.0.1");
            const proto = isLocal ? "http" : "https";
            return `${proto}://${host}`;
        }
    } catch (error) {
        // Fallback during static site generation / build phase
    }

    return "http://localhost:3000";
}

// Ultra-easy SEO creator: accepts API slug (e.g. "pages/home") or SEO object
export async function createSeo(
    input?: string | CreateSeoParams | Record<string, any> | null,
    pathArg: string = "/"
): Promise<Metadata> {
    let params: Record<string, any> | null = null;

    // If input is an API slug string (e.g. "pages/home"), fetch data automatically
    if (typeof input === "string") {
        try {
            const pageData = await fetchPageData<any>(input);
            params = pageData?.data?.seo || pageData?.seo || pageData?.data || pageData;
        } catch (error) {
            params = null;
        }
    } else {
        params = input || null;
    }

    // Resolve site base domain dynamically (localhost / terra / production)
    const siteUrl = await getSiteUrl();

    // Page Title
    const title =
        params?.title ||
        params?.seo_title ||
        params?.meta_title ||
        params?.og_title ||
        "Cliniques Oculus | Soins ophtalmologiques de précision & Médecine esthétique";

    // Meta Description
    const description =
        params?.description ||
        params?.seo_description ||
        params?.meta_description ||
        "Les Cliniques Oculus réunissent l'ophtalmologie de précision, la médecine esthétique et des soins de santé spécialisés.";

    // Social Preview Image
    const rawImage =
        params?.image ||
        params?.og_image ||
        params?.seo_image ||
        params?.og_img ||
        "/og-default.jpg";

    const image = rawImage.startsWith("http")
        ? rawImage
        : `${siteUrl}${rawImage.startsWith("/") ? rawImage : `/${rawImage}`}`;

    // Canonical URL Link
    const rawPath = params?.canonical || params?.path || pathArg || "/";
    const cleanPath = rawPath.startsWith("/") ? rawPath : `/${rawPath}`;
    const canonicalUrl = `${siteUrl}${cleanPath}`;

    // Meta Keywords Array
    const rawKeywords = params?.keywords || params?.seo_keywords;
    let keywords: string[] = [];
    if (Array.isArray(rawKeywords)) {
        keywords = rawKeywords;
    } else if (typeof rawKeywords === "string") {
        keywords = rawKeywords.split(",").map((k) => k.trim()).filter(Boolean);
    }

    const robots = params?.robots || params?.meta_robots || "noindex, nofollow";
    // Return Next.js Metadata object for page head
    return {
        title,
        description,
        keywords,
        robots,
        alternates: {
            canonical: canonicalUrl,
        },
        openGraph: {
            title,
            description,
            url: canonicalUrl,
            siteName: "Oculus Clinics",
            images: [{ url: image, width: 1200, height: 630, alt: title }],
            type: "website",
        },
        twitter: {
            card: "summary_large_image",
            title,
            description,
            images: [image],
        },
    };
}

// Aliases for maximum compatibility
export const getSeoForPage = createSeo;
export const buildMetadata = createSeo;

export default createSeo;
