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

export const load: PageServerLoad = async ({ locals }) => {
	console.log('[Dashboard] Loading - User:', locals.user?.id);
	
	if (!locals.user) {
		return {
			accountType: null,
			ads: [],
			adsCount: 0,
			mediaCount: 0,
			campaignsCount: 0,
			activeCampaigns: 0,
			screens: [],
			screensCount: 0,
			monthlyEarnings: 0,
			totalEarnings: 0,
			activeBroadcasts: 0,
		};
	}

	const accountType = locals.company?.account_type || null;
	const userId = locals.user.id.replace('user:', '');
	const db = await getSurrealDB();

	try {
		if (accountType === 'advertiser' || accountType === 'agency') {
			// Charger les données pour annonceurs et agences
			const [adsResult, mediaResult, campaignsResult, screensResult, regionsResult, bookingsResult] = await Promise.all([
				db.query<[any[]]>(
					`SELECT *, 
					 content,
					 content.url as content_url,
					 content.thumbnail_url as content_thumbnail,
					 (SELECT url, type FROM media_map WHERE ad = $parent.id AND type = "image" LIMIT 1)[0].url as first_image_url
					 FROM ad 
					 WHERE user = type::thing("user", $userId) 
					 ORDER BY updated_at DESC 
					 LIMIT 6`,
					{ userId }
				),
				db.query<[any[]]>(
					`SELECT count() AS count FROM media 
					 WHERE user = type::thing("user", $userId) 
					 GROUP ALL`,
					{ userId }
				),
				db.query<[any[]]>(
					`SELECT *, 
					 (SELECT name, status, output_url, thumbnail_url, custom_thumbnail_url, content, content.url as content_url, content.thumbnail_url as content_thumbnail,
					  (SELECT url, type FROM media_map WHERE ad = $parent.id AND type = "image" LIMIT 1)[0].url as first_image_url
					 FROM ad WHERE id = $parent.ad)[0] as ad_info
					 FROM campaign 
					 WHERE user = type::thing("user", $userId) 
					 ORDER BY created_at DESC`,
					{ userId }
				),
				// Total screens available in the platform
				db.query<[any[]]>(
					`SELECT count() AS count FROM screen GROUP ALL`
				),
				// Unique regions from user's campaigns
				db.query<[any[]]>(
					`SELECT selected_region FROM campaign 
					 WHERE user = type::thing("user", $userId) 
					 AND selected_region IS NOT NULL`,
					{ userId }
				),
				// Count bookings from user's campaigns
				db.query<[any[]]>(
					`SELECT count() AS count FROM booking 
					 WHERE campaign.user = type::thing("user", $userId) 
					 GROUP ALL`,
					{ userId }
				)
			]);

			const ads = serializeData(adsResult[0] || []);
			const campaigns = serializeData(campaignsResult[0] || []);
			
			const mediaCount = mediaResult[0]?.[0]?.count || 0;
			const activeCampaigns = campaigns.filter((c: any) => c.status === 'active').length;
			const screensCount = screensResult[0]?.[0]?.count || 0;
			
			// Count unique regions manually
			const regionsData = serializeData(regionsResult[0] || []);
			const uniqueRegions = new Set(regionsData.map((r: any) => r.selected_region).filter(Boolean));
			const regionsCount = uniqueRegions.size;
			
			// Handle bookings count safely
			let bookedSlotsCount = 0;
			try {
				bookedSlotsCount = bookingsResult[0]?.[0]?.count || 0;
			} catch (e) {
				console.error('[Dashboard] Error counting bookings:', e);
			}
			
			// Calculate total duration in days from active campaigns
			let totalDurationDays = 0;
			campaigns.forEach((campaign: any) => {
				if (campaign.start_date && campaign.end_date) {
					const start = new Date(campaign.start_date);
					const end = new Date(campaign.end_date);
					const duration = Math.ceil((end.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));
					if (duration > 0) totalDurationDays += duration;
				}
			});

			return {
				accountType,
				ads,
				adsCount: ads.length,
				campaigns,
				mediaCount,
				campaignsCount: campaigns.length,
				activeCampaigns,
				screensCount,
				regionsCount,
				bookedSlotsCount,
				totalDurationDays,
				screens: [],
				monthlyEarnings: 0,
				totalEarnings: 0,
				activeBroadcasts: 0,
			};
		} else if (accountType === 'broadcaster') {
			// TODO: Charger les données pour diffuseurs
			return {
				accountType,
				ads: [],
				adsCount: 0,
				mediaCount: 0,
				campaignsCount: 0,
				activeCampaigns: 0,
				screens: [],
				screensCount: 0,
				monthlyEarnings: 0,
				totalEarnings: 0,
				activeBroadcasts: 0,
			};
		}
	} catch (error) {
		console.error('[Dashboard] Error loading data:', error);
	}

	// Retourner des données vides en cas d'erreur
	return {
		accountType,
		ads: [],
		adsCount: 0,
		mediaCount: 0,
		campaignsCount: 0,
		activeCampaigns: 0,
		screens: [],
		screensCount: 0,
		monthlyEarnings: 0,
		totalEarnings: 0,
		activeBroadcasts: 0,
	};
};
