import { env } from '$env/dynamic/private';
import { redirect, type Cookies } from '@sveltejs/kit';

const DEFAULT_WORKSPACE_BASE_URL = 'https://workspace.aduanasoft.com';
const RETURN_PATH_COOKIE = 'workspace_return_path';

/**
 * Autenticación 100% vía el Hub/Workspace (patrón SIWEB). El CRM NUNCA habla
 * directo a Keycloak: el login entra por el App Launcher del workspace (relay
 * → /auth/sso → Hub /sso-exchange) y el resto de auth va por la API del Hub.
 */

/**
 * True solo cuando la URL pública usa HTTPS. Se usa para el flag `secure` de las
 * cookies (en vez de NODE_ENV) para que funcionen en dev HTTP LAN (192.168.x.x).
 */
export function isSecureContext(): boolean {
	const origin = (env.ORIGIN || process.env.ORIGIN || '').trim();
	if (origin) return origin.startsWith('https://');
	return process.env.NODE_ENV === 'production';
}

function stripTrailingSlashes(value: string): string {
	return value.replace(/\/+$/, '');
}

/**
 * Detecta URLs solo accesibles localmente (localhost, IPs LAN/privadas, hosts
 * internos de Docker). No son válidas como URL pública del Workspace.
 */
function isDevOnlyUrl(rawUrl: string): boolean {
	try {
		const parsed = new URL(rawUrl);
		const host = parsed.hostname.toLowerCase();
		return (
			host === 'localhost' ||
			host === '127.0.0.1' ||
			host === 'host.docker.internal' ||
			host === 'backend' ||
			host === 'hub-keycloak' ||
			/^192\.168\./.test(host) ||
			/^10\./.test(host) ||
			/^172\.(1[6-9]|2\d|3[01])\./.test(host)
		);
	} catch {
		return false;
	}
}

export function getWorkspaceBaseUrl(): string {
	const candidates = [
		(env.VITE_HUB_URL || '').trim(),
		(env.HUB_URL || '').trim(),
		DEFAULT_WORKSPACE_BASE_URL
	].filter(Boolean);

	for (const candidate of candidates) {
		if (!isDevOnlyUrl(candidate)) {
			return stripTrailingSlashes(candidate);
		}
	}

	return DEFAULT_WORKSPACE_BASE_URL;
}

/**
 * Normaliza la URL base del sistema (Mi Aplicación) para construir redirect_uri.
 * Corrige el caso donde `ORIGIN` env var apunta a localhost en producción.
 */
export function resolveSystemBaseUrl(requestOrigin: string): string {
	if (!isDevOnlyUrl(requestOrigin)) {
		return stripTrailingSlashes(requestOrigin);
	}

	const candidates = [
		(env.SITE_URL || '').trim(),
		(env.APP_URL || '').trim(),
		(env.PUBLIC_URL || '').trim(),
	];

	for (const candidate of candidates) {
		if (candidate && !isDevOnlyUrl(candidate)) {
			return stripTrailingSlashes(candidate);
		}
	}

	return stripTrailingSlashes(requestOrigin);
}

/**
 * URL de login del Workspace. NO lleva `return_to` a Mi Aplicación: el Hub
 * muestra el App Launcher y el usuario re-entra al CRM por relay
 * (→ /auth/sso?relay=). Así se evita el rebote a /login sin sesión (bucle) y no
 * se usa ningún flujo OIDC directo contra Keycloak.
 */
export function getWorkspaceLoginUrl(): string {
	return `${getWorkspaceBaseUrl()}/login`;
}

export function storeReturnPath(cookies: Cookies, path: string): void {
	if (!path || !path.startsWith('/')) return;
	cookies.set(RETURN_PATH_COOKIE, path, {
		path: '/',
		httpOnly: true,
		sameSite: 'lax',
		secure: isSecureContext(),
		maxAge: 60 * 10
	});
}

export function getCleanReturnPath(url: URL): string {
	const cleanParams = new URLSearchParams(url.searchParams);
	cleanParams.delete('sso_verified');

	const queryString = cleanParams.toString();
	return queryString ? `${url.pathname}?${queryString}` : url.pathname;
}

export function storeWorkspaceReturnPath(cookies: Cookies, url: URL): string {
	const returnPath = getCleanReturnPath(url);

	cookies.set(RETURN_PATH_COOKIE, returnPath, {
		path: '/',
		httpOnly: true,
		sameSite: 'lax',
		secure: isSecureContext(),
		maxAge: 60 * 10
	});

	return returnPath;
}

export function readWorkspaceReturnPath(cookies: Cookies, fallbackPath: string): string {
	const storedReturnPath = cookies.get(RETURN_PATH_COOKIE);
	if (storedReturnPath && storedReturnPath.startsWith('/')) {
		return storedReturnPath;
	}

	return fallbackPath;
}

export function clearWorkspaceReturnPath(cookies: Cookies): void {
	cookies.delete(RETURN_PATH_COOKIE, { path: '/' });
}

/**
 * URL del Hub FastAPI para llamadas server-to-server (ej. sso-exchange).
 * No aplica isDevOnlyUrl: las URLs internas de Docker son válidas aquí.
 */
export function getHubBackendUrl(): string {
	const direct =
		(env.HUB_BACKEND_URL || '').trim() ||
		(env.INTERNAL_HUB_URL || '').trim();
	if (direct) return stripTrailingSlashes(direct);
	return getWorkspaceBaseUrl();
}

/**
 * Redirige al login del Workspace (App Launcher). Único punto de entrada de
 * login: el CRM no inicia ningún flujo contra Keycloak.
 */
export function redirectToWorkspaceLogin(cookies: Cookies, url: URL): never {
	// Modo local: nunca salir al workspace, mostrar el login local.
	if ((env.DEV_LOCAL_AUTH ?? '').toLowerCase() === 'true') {
		throw redirect(303, '/login');
	}
	storeWorkspaceReturnPath(cookies, url);
	throw redirect(303, getWorkspaceLoginUrl());
}
