import type { Metadata } from "next";
import type { Coupon, Store } from "@/types/domain";
import type { ApiResponse } from "@/types/api";
import { siteConfig } from "@/config/site";

const fallbackApiBase = "http://localhost/ReactCouponApp/laravel-backend/public/api/v1";

function getApiBaseUrl() {
  const raw = process.env.API_BASE_URL || process.env.NEXT_PUBLIC_API_BASE_URL || fallbackApiBase;
  return raw.replace(/\/$/, "");
}

async function fetchApi<T>(path: string): Promise<T | null> {
  try {
    const response = await fetch(`${getApiBaseUrl()}${path}`, {
      headers: { Accept: "application/json" },
      next: { revalidate: 120 },
    });

    if (!response.ok) {
      return null;
    }

    const payload = (await response.json()) as ApiResponse<T>;
    return payload.data ?? null;
  } catch {
    return null;
  }
}

export async function getStoreBySlug(slug: string): Promise<Store | null> {
  const stores = await fetchApi<Store[]>("/stores?per_page=100&sort=latest");

  if (!stores || stores.length === 0) {
    return null;
  }

  const normalizedSlug = slug.trim().toLowerCase();
  return stores.find((store) => store.slug?.trim().toLowerCase() === normalizedSlug) || null;
}

export async function getStoreDetailsById(storeId: number): Promise<Store | null> {
  if (!Number.isFinite(storeId) || storeId <= 0) {
    return null;
  }

  return fetchApi<Store>(`/stores/${storeId}`);
}

export async function getStoreForSeo(slug: string): Promise<Store | null> {
  const candidate = await getStoreBySlug(slug);
  if (!candidate) {
    return null;
  }

  return (await getStoreDetailsById(candidate.id)) || candidate;
}

export async function getCouponById(couponId: number): Promise<Coupon | null> {
  if (!Number.isFinite(couponId) || couponId <= 0) {
    return null;
  }

  return fetchApi<Coupon>(`/coupons/${couponId}`);
}

export function storeMetadata(store: Store | null): Metadata {
  if (!store) {
    return {
      title: `${siteConfig.nameAr} | متجر غير موجود`,
      description: siteConfig.descriptionAr,
      robots: { index: false, follow: false },
    };
  }

  const title = `${store.name_ar} | كوبونات وخصومات`; 
  const description = (store.description_ar || store.description_en || `أفضل عروض وكوبونات ${store.name_ar}`).slice(0, 155);

  return {
    title,
    description,
    alternates: {
      canonical: `${siteConfig.url}/stores/${store.slug}`,
    },
    openGraph: {
      title,
      description,
      type: "website",
      url: `${siteConfig.url}/stores/${store.slug}`,
      images: store.logo ? [{ url: store.logo }] : undefined,
    },
  };
}

export function couponMetadata(coupon: Coupon | null, couponId: number): Metadata {
  if (!coupon) {
    return {
      title: `${siteConfig.nameAr} | كوبون غير موجود`,
      description: siteConfig.descriptionAr,
      robots: { index: false, follow: false },
    };
  }

  const title = `${coupon.title_ar} | كوبون خصم`;
  const description = (coupon.description_ar || coupon.description_en || `عرض خصم من ${coupon.store?.name_ar || "متجر شريك"}`).slice(0, 155);

  return {
    title,
    description,
    alternates: {
      canonical: `${siteConfig.url}/coupons/${coupon.id || couponId}`,
    },
    openGraph: {
      title,
      description,
      type: "article",
      url: `${siteConfig.url}/coupons/${coupon.id || couponId}`,
      images: coupon.store?.logo ? [{ url: coupon.store.logo }] : undefined,
    },
  };
}
