'use client'; import { useState, useEffect } from 'react'; import { useNotification } from './NotificationProvider'; import { useBodyScrollLock } from '@/lib/body-scroll-lock'; interface Trajet { id: string; date: string; adresseDepart: string; adresseArrivee: string; chauffeur?: { id: string; nom: string; prenom: string; } | null; } interface ValidationModalProps { trajet: Trajet; onClose: () => void; onSuccess: () => void; } export default function ValidationModal({ trajet, onClose, onSuccess }: ValidationModalProps) { const { showNotification } = useNotification(); useBodyScrollLock(true); const [loading, setLoading] = useState(false); const [dureeTrajet, setDureeTrajet] = useState(null); // Calculer la durée du trajet en heures const calculateDuration = async () => { if (!trajet.adresseDepart || !trajet.adresseArrivee) { return; } try { // Géocoder l'adresse de départ const departResponse = await fetch( `https://nominatim.openstreetmap.org/search?format=json&q=${encodeURIComponent(trajet.adresseDepart)}&limit=1&countrycodes=fr`, { headers: { 'User-Agent': 'MAD Platform', 'Accept-Language': 'fr-FR,fr;q=0.9', }, } ); if (!departResponse.ok) { return; } // Attendre avant la deuxième requête await new Promise(resolve => setTimeout(resolve, 1000)); const arriveeResponse = await fetch( `https://nominatim.openstreetmap.org/search?format=json&q=${encodeURIComponent(trajet.adresseArrivee)}&limit=1&countrycodes=fr`, { headers: { 'User-Agent': 'MAD Platform', 'Accept-Language': 'fr-FR,fr;q=0.9', }, } ); if (departResponse.ok && arriveeResponse.ok) { const [departData, arriveeData] = await Promise.all([ departResponse.json(), arriveeResponse.json(), ]); if (departData.length > 0 && arriveeData.length > 0) { const lat1 = parseFloat(departData[0].lat); const lon1 = parseFloat(departData[0].lon); const lat2 = parseFloat(arriveeData[0].lat); const lon2 = parseFloat(arriveeData[0].lon); // Calcul de la distance (Haversine) const R = 6371; // Rayon de la Terre en km const dLat = ((lat2 - lat1) * Math.PI) / 180; const dLon = ((lon2 - lon1) * Math.PI) / 180; const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos((lat1 * Math.PI) / 180) * Math.cos((lat2 * Math.PI) / 180) * Math.sin(dLon / 2) * Math.sin(dLon / 2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); const distance = R * c; // Distance en km // Estimation du temps : vitesse moyenne de 50 km/h en ville // On multiplie par 1.3 pour tenir compte des détours const distanceWithDetour = distance * 1.3; const vitesseMoyenne = 50; // km/h const dureeEnHeures = distanceWithDetour / vitesseMoyenne; setDureeTrajet(Math.round(dureeEnHeures * 10) / 10); // Arrondir à 1 décimale } } } catch (error) { console.error('Erreur lors du calcul de la durée:', error); } }; useEffect(() => { calculateDuration(); }, []); const handleValidate = async () => { if (!trajet.chauffeur) { showNotification('warning', 'Aucun chauffeur assigné à ce trajet'); return; } if (!dureeTrajet) { showNotification('warning', 'Impossible de calculer la durée du trajet'); return; } setLoading(true); try { const response = await fetch(`/api/trajets/${trajet.id}/validate`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ dureeHeures: dureeTrajet, }), }); if (response.ok) { showNotification('success', `Trajet validé avec succès (${dureeTrajet}h déduites)`); onSuccess(); onClose(); } else { const error = await response.json(); showNotification('error', error.error || 'Erreur lors de la validation du trajet'); } } catch (error) { console.error('Erreur lors de la validation:', error); showNotification('error', 'Erreur lors de la validation du trajet'); } finally { setLoading(false); } }; return (
{/* Header */}

Valider le trajet

Confirmer la validation du trajet

{/* Content */}

En validant ce trajet, les heures seront déduites du contrat du chauffeur.

Cette action ne peut pas être annulée.

{trajet.chauffeur && (
{trajet.chauffeur.prenom} {trajet.chauffeur.nom}
)} {dureeTrajet !== null ? (
Temps estimé {dureeTrajet.toFixed(1)}h

{dureeTrajet.toFixed(1)} heure{dureeTrajet >= 2 ? 's' : ''} sera{dureeTrajet < 2 ? '' : 'ont'} déduite{dureeTrajet < 2 ? '' : 's'} des heures disponibles du chauffeur.

) : (
Calcul de la durée du trajet...
)}
{/* Footer */}
); }