// Airport database — used for display names and fallback when backend doesn't return full info. window.AIRPORTS = { CDG: { city: "Paris", name: "Charles de Gaulle", lat: 49.0097, lon: 2.5479, iata: "CDG" }, ORY: { city: "Paris", name: "Orly", lat: 48.7233, lon: 2.3794, iata: "ORY" }, LHR: { city: "Londres", name: "Heathrow", lat: 51.4700, lon: -0.4543, iata: "LHR" }, JFK: { city: "New York", name: "JFK", lat: 40.6413, lon: -73.7781, iata: "JFK" }, LAX: { city: "Los Angeles", name: "LAX", lat: 33.9416, lon:-118.4085, iata: "LAX" }, SFO: { city: "San Francisco", name: "SFO", lat: 37.6213, lon:-122.3790, iata: "SFO" }, NRT: { city: "Tokyo", name: "Narita", lat: 35.7720, lon: 140.3929, iata: "NRT" }, HND: { city: "Tokyo", name: "Haneda", lat: 35.5494, lon: 139.7798, iata: "HND" }, HKG: { city: "Hong Kong", name: "Chek Lap Kok", lat: 22.3080, lon: 113.9185, iata: "HKG" }, SIN: { city: "Singapour", name: "Changi", lat: 1.3644, lon: 103.9915, iata: "SIN" }, DXB: { city: "Dubaï", name: "Dubaï International", lat: 25.2532, lon: 55.3657, iata: "DXB" }, DOH: { city: "Doha", name: "Hamad", lat: 25.2731, lon: 51.6080, iata: "DOH" }, FRA: { city: "Francfort", name: "Frankfurt", lat: 50.0379, lon: 8.5622, iata: "FRA" }, AMS: { city: "Amsterdam", name: "Schiphol", lat: 52.3105, lon: 4.7683, iata: "AMS" }, MAD: { city: "Madrid", name: "Barajas", lat: 40.4983, lon: -3.5676, iata: "MAD" }, FCO: { city: "Rome", name: "Fiumicino", lat: 41.8003, lon: 12.2389, iata: "FCO" }, BCN: { city: "Barcelone", name: "El Prat", lat: 41.2974, lon: 2.0833, iata: "BCN" }, IST: { city: "Istanbul", name: "Istanbul Airport", lat: 41.2611, lon: 28.7421, iata: "IST" }, GRU: { city: "São Paulo", name: "Guarulhos", lat:-23.4356, lon: -46.4731, iata: "GRU" }, EZE: { city: "Buenos Aires", name: "Ezeiza", lat:-34.8222, lon: -58.5358, iata: "EZE" }, SYD: { city: "Sydney", name: "Kingsford Smith", lat:-33.9399, lon: 151.1753, iata: "SYD" }, YYZ: { city: "Toronto", name: "Pearson", lat: 43.6777, lon: -79.6248, iata: "YYZ" }, YVR: { city: "Vancouver", name: "Vancouver", lat: 49.1939, lon:-123.1844, iata: "YVR" }, ICN: { city: "Séoul", name: "Incheon", lat: 37.4602, lon: 126.4407, iata: "ICN" }, PEK: { city: "Pékin", name: "Capital", lat: 40.0799, lon: 116.6031, iata: "PEK" }, PVG: { city: "Shanghai", name: "Pudong", lat: 31.1443, lon: 121.8083, iata: "PVG" }, BOM: { city: "Mumbai", name: "Chhatrapati Shivaji", lat: 19.0896, lon: 72.8656, iata: "BOM" }, DEL: { city: "Delhi", name: "Indira Gandhi", lat: 28.5562, lon: 77.1000, iata: "DEL" }, JNB: { city: "Johannesburg", name: "OR Tambo", lat:-26.1392, lon: 28.2460, iata: "JNB" }, CAI: { city: "Le Caire", name: "Cairo Intl.", lat: 30.1219, lon: 31.4056, iata: "CAI" }, MEX: { city: "Mexico", name: "Benito Juárez", lat: 19.4361, lon: -99.0719, iata: "MEX" }, ORD: { city: "Chicago", name: "O'Hare", lat: 41.9742, lon: -87.9073, iata: "ORD" }, ATL: { city: "Atlanta", name: "Hartsfield-Jackson", lat: 33.6407, lon: -84.4277, iata: "ATL" }, MIA: { city: "Miami", name: "Miami Intl.", lat: 25.7959, lon: -80.2870, iata: "MIA" }, BOS: { city: "Boston", name: "Logan", lat: 42.3656, lon: -71.0096, iata: "BOS" }, SEA: { city: "Seattle", name: "Sea-Tac", lat: 47.4502, lon:-122.3088, iata: "SEA" }, GVA: { city: "Genève", name: "Genève", lat: 46.2381, lon: 6.1090, iata: "GVA" }, ZRH: { city: "Zurich", name: "Zurich", lat: 47.4647, lon: 8.5492, iata: "ZRH" }, MUC: { city: "Munich", name: "Munich", lat: 48.3538, lon: 11.7861, iata: "MUC" }, LIS: { city: "Lisbonne", name: "Humberto Delgado", lat: 38.7813, lon: -9.1359, iata: "LIS" }, CPH: { city: "Copenhague", name: "Kastrup", lat: 55.6180, lon: 12.6560, iata: "CPH" }, ARN: { city: "Stockholm", name: "Arlanda", lat: 59.6519, lon: 17.9186, iata: "ARN" }, HEL: { city: "Helsinki", name: "Vantaa", lat: 60.3172, lon: 24.9633, iata: "HEL" }, KEF: { city: "Reykjavik", name: "Keflavik", lat: 63.9850, lon: -22.6056, iata: "KEF" }, ANC: { city: "Anchorage", name: "Ted Stevens", lat: 61.1744, lon:-149.9961, iata: "ANC" }, NCE: { city: "Nice", name: "Côte d'Azur", lat: 43.6584, lon: 7.2159, iata: "NCE" }, MRS: { city: "Marseille", name: "Marseille Provence", lat: 43.4393, lon: 5.2214, iata: "MRS" }, TLS: { city: "Toulouse", name: "Blagnac", lat: 43.6293, lon: 1.3638, iata: "TLS" }, LYS: { city: "Lyon", name: "Saint-Exupéry", lat: 45.7256, lon: 5.0811, iata: "LYS" }, EWR: { city: "New York", name: "Newark", lat: 40.6895, lon: -74.1745, iata: "EWR" }, }; // Map backend risk value ("moderate") to the CSS class used by the UI ("mod"). function toRiskClass(r) { return r === "moderate" ? "mod" : r; } // Call POST /flight on the backend, then transform the response into the // { trajectory, meta, solarEvent } shape that app.jsx expects. window.buildTrajectory = async function buildTrajectory({ depIata, arrIata, date, departureTime, flightNumber }) { var body = { departure_iata: depIata, arrival_iata: arrIata, date: date, departure_time: departureTime || "10:00", }; if (flightNumber) body.flight_number = flightNumber; var resp = await fetch("/flight", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body), }); if (!resp.ok) { var err = await resp.json().catch(function () { return {}; }); throw new Error(err.detail || "Erreur serveur"); } var data = await resp.json(); var fi = data.flight_info; // Trajectory object — shape consumed by ResultPanel and TrajectoryMap var trajectory = { totalDose: data.total_dose_usv, lowDose: data.lower_usv, highDose: data.upper_usv, totalRisk: toRiskClass(data.risk_level), distanceKm: fi.distance_km, durationHours: fi.duration_min / 60, samples: data.waypoints.map(function (wp) { return { lat: wp.lat, lon: wp.lon, altFt: Math.round(wp.alt_km * 3280.84), doseRate: wp.dose_usvh, risk: toRiskClass(wp.risk_level), }; }), }; // Meta object — shape consumed by ResultPanel var fallback = function (iata) { return { iata: iata, city: iata, name: iata, lat: 0, lon: 0 }; }; var fromAp = fi.from_airport || window.AIRPORTS[fi.departure] || fallback(fi.departure); var toAp = fi.to_airport || window.AIRPORTS[fi.arrival] || fallback(fi.arrival); var cruiseFt = parseInt(fi.cruise_altitude.replace("FL", ""), 10) * 100; var meta = { flightNo: fi.flight_number, airline: fi.airline, fromAp: fromAp, toAp: toAp, date: date, cruiseFt: cruiseFt, kpUsed: fi.kp_used, dataSource: fi.solar_data_source, }; var solarEvent = data.solar_event || null; return { trajectory: trajectory, meta: meta, solarEvent: solarEvent }; };