import type { PageServerLoad } from './$types';
import { getSurrealDB } from '$lib/server/db';
import { serializeData } from '$lib/utils/serialize';

const PAGE_LOAD_TIMEOUT_MS = 1500;

const withTimeout = async <T>(
	promise: Promise<T>,
	ms: number,
	label: string
): Promise<T> => {
	return new Promise<T>((resolve, reject) => {
		const timer = setTimeout(() => {
			reject(new Error(`Timeout ${label} after ${ms}ms`));
		}, ms);

		promise
			.then((value) => {
				clearTimeout(timer);
				resolve(value);
			})
			.catch((error) => {
				clearTimeout(timer);
				reject(error);
			});
	});
};

export const load: PageServerLoad = async ({ locals, url }) => {
	const userId = locals.user?.id;
	
	if (!userId) {
		return {
			ads: [],
			stats: { total: 0, draft: 0, creating: 0, validation: 0, ready: 0, live: 0, archived: 0 }
		};
	}
	
	const cleanUserId = userId.replace('user:', '');
	
	try {
		const db = await withTimeout(
			getSurrealDB(),
			PAGE_LOAD_TIMEOUT_MS,
			"getSurrealDB for ads page"
		);
		
		// Filtre par statut depuis l'URL
		const filterStatus = url.searchParams.get('status');
		
		// Récupérer les publicités avec les médias associés
		let query = `
			SELECT 
				*,
				template.name as template_name,
				content.url as content_url,
				content.thumbnail_url as content_thumbnail
			FROM ad 
			WHERE user = type::thing("user", $userId)
		`;
		
		if (filterStatus && filterStatus !== 'all') {
			query += ` AND status = $status`;
		}
		
		query += ` ORDER BY updated_at DESC`;
		
		const adsResult = await withTimeout(
			db.query<[any[]]>(query, { 
				userId: cleanUserId,
				status: filterStatus 
			}),
			PAGE_LOAD_TIMEOUT_MS,
			"query ads"
		);
		
		// Statistiques par statut - Requêtes séparées car IF() n'existe pas en SurrealDB
		const statsResult = await withTimeout(
			db.query<[any[], any[], any[], any[], any[], any[], any[]]>(`
				SELECT count() as total FROM ad WHERE user = type::thing("user", $userId) GROUP ALL;
				SELECT count() as draft FROM ad WHERE user = type::thing("user", $userId) AND status = "draft" GROUP ALL;
				SELECT count() as creating FROM ad WHERE user = type::thing("user", $userId) AND status = "creating" GROUP ALL;
				SELECT count() as validation FROM ad WHERE user = type::thing("user", $userId) AND status = "validation" GROUP ALL;
				SELECT count() as ready FROM ad WHERE user = type::thing("user", $userId) AND status = "ready" GROUP ALL;
				SELECT count() as live FROM ad WHERE user = type::thing("user", $userId) AND status = "live" GROUP ALL;
				SELECT count() as archived FROM ad WHERE user = type::thing("user", $userId) AND status = "archived" GROUP ALL;
			`, { userId: cleanUserId }),
			PAGE_LOAD_TIMEOUT_MS,
			"query ads stats"
		);
		
		const stats = {
			total: statsResult[0]?.[0]?.total || 0,
			draft: statsResult[1]?.[0]?.draft || 0,
			creating: statsResult[2]?.[0]?.creating || 0,
			validation: statsResult[3]?.[0]?.validation || 0,
			ready: statsResult[4]?.[0]?.ready || 0,
			live: statsResult[5]?.[0]?.live || 0,
			archived: statsResult[6]?.[0]?.archived || 0
		};
		
		return {
			ads: serializeData(adsResult[0] || []),
			stats,
			currentFilter: filterStatus || 'all'
		};
	} catch (error) {
		console.error('Error loading ads:', error);
		return {
			ads: [],
			stats: { total: 0, draft: 0, creating: 0, validation: 0, ready: 0, live: 0, archived: 0 },
			currentFilter: 'all'
		};
	}
};
