import type { PageServerLoad, Actions } from './$types';
import { fail } from '@sveltejs/kit';
import { getSurrealDB } from '$lib/server/db';
import { uploadToR2 } from '$lib/server/cloudflare';
import { serializeData } from '$lib/utils/serialize';

export const load: PageServerLoad = async () => {
	const db = await getSurrealDB();
	
	try {
		// Récupérer le paramètre homepage_media
		const settingsResult = await db.query<[any[]]>(
			'SELECT * FROM setting WHERE key = "homepage_media"'
		);
		
		const setting = settingsResult[0]?.[0];
		
		// Récupérer les pays
		const countriesResult = await db.query<[any[]]>(
			'SELECT * FROM country ORDER BY name ASC'
		);
		
		const countries = countriesResult[0] || [];
		
		console.log(`[Settings] Found ${countries.length} countries from query`);
		
		// Ajouter le nombre d'écrans et de régions uniques pour chaque pays
		const countriesWithScreenCount = await Promise.all(
			countries.map(async (country: any) => {
				try {
					// Compter les écrans
					const screenCountResult = await db.query<[any[]]>(
						`SELECT COUNT() as count FROM screen WHERE location.country = "${country.name}"`
					);
					const screenCount = screenCountResult[0]?.[0]?.count || 0;
					
					// Récupérer les régions uniques
					const regionsResult = await db.query<[{region: string}[]]>(
						`SELECT region FROM location WHERE country = "${country.name}" AND region != NONE GROUP BY region`
					);
					const regions = regionsResult[0] || [];
					const regionCount = regions.length;
					
					return { 
						...country, 
						screen_count: screenCount,
						region_count: regionCount,
						regions: regions.map((r: any) => r.region)
					};
				} catch (err) {
					console.error(`Error loading data for ${country.name}:`, err);
					return { 
						...country, 
						screen_count: 0,
						region_count: 0,
						regions: []
					};
				}
			})
		);
		
		console.log(`[Settings] Returning ${countriesWithScreenCount.length} countries`);
		
		return {
			currentHomepageMedia: setting ? serializeData(setting.value) : null,
			countries: serializeData(countriesWithScreenCount)
		};
	} catch (error) {
		console.error('Error loading settings:', error);
		return {
			currentHomepageMedia: null,
			countries: []
		};
	}
};

export const actions: Actions = {
	uploadHomepageMedia: async ({ request }) => {
		const formData = await request.formData();
		const file = formData.get('file') as File;
		
		if (!file) {
			return fail(400, { error: 'Aucun fichier sélectionné' });
		}
		
		// Vérifier le type de fichier
		const isVideo = file.type.startsWith('video/');
		const isImage = file.type.startsWith('image/');
		
		if (!isVideo && !isImage) {
			return fail(400, { error: 'Le fichier doit être une image ou une vidéo' });
		}
		
		// Vérifier la taille (max 50MB)
		const maxSize = 50 * 1024 * 1024; // 50MB
		if (file.size > maxSize) {
			return fail(400, { error: 'Le fichier est trop volumineux (max 50MB)' });
		}
		
		try {
			// Générer un nom de fichier unique
			const timestamp = Date.now();
			const extension = file.name.split('.').pop();
			const fileName = `neoad/homepage/${timestamp}.${extension}`;
			
			// Upload vers R2
			const result = await uploadToR2(file, fileName, file.type);
			
			// Sauvegarder dans la base de données
			const db = await getSurrealDB();
			
			const mediaData = {
				type: isVideo ? 'video' : 'image',
				url: result.url,
				fileName: fileName,
				originalName: file.name,
				size: file.size,
				mimeType: file.type,
				uploadedAt: new Date().toISOString()
			};
			
			// Créer ou mettre à jour le setting
			await db.query(
				`DELETE FROM setting WHERE key = "homepage_media";
				 CREATE setting CONTENT {
					key: "homepage_media",
					value: $value,
					updated_at: time::now()
				 }`,
				{ value: mediaData }
			);
			
			return {
				success: 'Média de la page d\'accueil mis à jour avec succès'
			};
		} catch (error) {
			console.error('Error uploading file:', error);
			return fail(500, { error: 'Erreur lors de l\'upload du fichier' });
		}
	}
};
