import { json, type RequestHandler } from '@sveltejs/kit';
import { getSurrealDB } from '$lib/server/db';

export const GET: RequestHandler = async ({ params }) => {
	const screenId = params.id;
	
	try {
		const db = await getSurrealDB();
		
		// Récupérer l'écran avec ses disponibilités
		const [screen] = await db.query<any[]>(`
			SELECT 
				id, 
				name,
				unavailable_weeks,
				weekly_availability
			FROM screen 
			WHERE id = type::thing("screen", $id)
		`, { id: screenId });
		
		if (!screen || screen.length === 0) {
			return json({ error: 'Screen not found' }, { status: 404 });
		}
		
		const screenData = screen[0];
		
		// Récupérer les réservations existantes pour cet écran
		const [bookings] = await db.query<any[]>(`
			SELECT 
				start_date,
				end_date,
				selected_weeks,
				campaign.name as campaign_name
			FROM screen_booking 
			WHERE screen = type::thing("screen", $id)
			AND status IN ['active', 'confirmed', 'pending']
		`, { id: screenId });
		
		// Convertir les réservations en semaines réservées
		const bookedWeeks: { weekNumber: number; campaignName?: string }[] = [];
		
		if (bookings && bookings.length > 0) {
			bookings.forEach((booking: any) => {
				if (booking.selected_weeks && Array.isArray(booking.selected_weeks)) {
					// Si les semaines sont stockées directement
					booking.selected_weeks.forEach((week: number) => {
						bookedWeeks.push({
							weekNumber: week,
							campaignName: booking.campaign_name
						});
					});
				} else if (booking.start_date && booking.end_date) {
					// Sinon, calculer les semaines à partir des dates
					const startDate = new Date(booking.start_date);
					const endDate = new Date(booking.end_date);
					
					let currentDate = new Date(startDate);
					while (currentDate <= endDate) {
						const weekNumber = getISOWeekNumber(currentDate);
						if (!bookedWeeks.some(w => w.weekNumber === weekNumber)) {
							bookedWeeks.push({
								weekNumber,
								campaignName: booking.campaign_name
							});
						}
						currentDate.setDate(currentDate.getDate() + 7);
					}
				}
			});
		}
		
		// Récupérer les semaines indisponibles de l'écran
		const unavailableWeeks = screenData.unavailable_weeks || [];
		
		return json({
			unavailableWeeks,
			bookedWeeks,
			weeklyAvailability: screenData.weekly_availability || null
		});
		
	} catch (error) {
		console.error('Error loading screen availability:', error);
		return json({ error: 'Failed to load availability' }, { status: 500 });
	}
};

// Calculer le numéro de semaine ISO
function getISOWeekNumber(date: Date): number {
	const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
	const dayNum = d.getUTCDay() || 7;
	d.setUTCDate(d.getUTCDate() + 4 - dayNum);
	const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
	return Math.ceil((((d.getTime() - yearStart.getTime()) / 86400000) + 1) / 7);
}
