import { headers } from 'next/headers';
import { DEFAULT_STORE_CONFIG, type StoreConfig } from '@/components/store/config/defaultStoreConfig';
import { resolveStoreIdentifier } from '@/lib/storeHost';

/**
 * Extrae el subdominio del host.
 *   empresa1.novasis.com → "empresa1"
 *   localhost:3001        → null (usa STORE_SUBDOMINIO_DEV)
 */

/**
 * Carga la configuración publicada de la tienda desde el backend ERP,
 * resolviendo el tenant por subdominio. Si no hay backend o falla, cae al
 * diseño estándar (DEFAULT_STORE_CONFIG) para no romper el render.
 */
export async function loadStoreConfig(opts?: { previewToken?: string }): Promise<StoreConfig> {
	const backendUrl = process.env.BACKEND_URL;
	const appToken = process.env.STORE_APP_TOKEN;

	const hdrs = await headers();
	const host = hdrs.get('host') ?? '';
	const subdominio = resolveStoreIdentifier(host) ?? process.env.STORE_SUBDOMINIO_DEV;

	if (!backendUrl || !appToken || !subdominio) {
		return DEFAULT_STORE_CONFIG;
	}

	// Vista previa del borrador: token firmado que emite el panel. Sin caché, para que
	// cada cambio guardado se vea al recargar.
	const previewQs = opts?.previewToken ? `&preview=${encodeURIComponent(opts.previewToken)}` : '';
	const url = `${backendUrl}/api/v1/ecommerce/public/config?subdominio=${encodeURIComponent(subdominio)}${previewQs}`;

	try {
		const res = await fetch(url, {
			headers: { 'x-app-key': appToken },
			// `revalidate: 60` es el techo de seguridad; `tags` permite invalidar
			// al instante desde /api/revalidate cuando el panel admin publica.
			...(opts?.previewToken
				? { cache: 'no-store' as const }
				: { next: { revalidate: 60, tags: [`store-config-${subdominio}`] } }),
			signal: AbortSignal.timeout(8000)
		});
		// Dominio que no es de ninguna tienda (o que cambió de dirección): aviso de tienda
		// no encontrada. Antes caía al diseño de ejemplo de la plantilla, que se veía como
		// una tienda real con productos inventados.
		if (res.status === 404) {
			return {
				...DEFAULT_STORE_CONFIG,
				status: 'closed',
				closedReason: 'no_encontrada',
				identity: { ...DEFAULT_STORE_CONFIG.identity, name: 'Tienda no encontrada', slogan: '', logoUrl: null, faviconUrl: null }
			};
		}
		if (!res.ok) {
			return DEFAULT_STORE_CONFIG;
		}
		const config = (await res.json()) as Partial<StoreConfig>;
		// Merge defensivo sobre el default para tolerar campos faltantes
		return { ...DEFAULT_STORE_CONFIG, ...config } as StoreConfig;
	} catch {
		return DEFAULT_STORE_CONFIG;
	}
}
