'Failed to fetch data from OpenWeatherMap API.']); exit; } $weather_data = json_decode($response, true); if ($weather_data === null || !isset($weather_data['current'])) { http_response_code(500); echo json_encode(['error' => 'Invalid response from OpenWeatherMap API.', 'details' => $weather_data]); exit; } // --- Data Transformation & Storage --- $current_weather = $weather_data['current']; $temperature_f = $current_weather['temp']; $is_extreme_heat = ($temperature_f > 95); $is_extreme_cold = ($temperature_f < 32); $weather_record = [ ':location_name' => "Charlotte, NC", ':zip_code' => "28202", ':observation_time' => date('Y-m-d H:i:s', $current_weather['dt'] ?? time()), ':weather_condition' => $current_weather['weather'][0]['main'] ?? null, ':weather_description' => $current_weather['weather'][0]['description'] ?? null, ':weather_icon' => $current_weather['weather'][0]['icon'] ?? null, ':temperature_f' => $temperature_f, ':feels_like_f' => $current_weather['feels_like'] ?? null, ':temp_min_f' => $weather_data['daily'][0]['temp']['min'] ?? null, // Approximating from daily ':temp_max_f' => $weather_data['daily'][0]['temp']['max'] ?? null, // Approximating from daily ':humidity_pct' => $current_weather['humidity'] ?? null, ':wind_speed_mph' => $current_weather['wind_speed'] ?? null, ':is_extreme_heat' => $is_extreme_heat ? 1 : 0, ':is_extreme_cold' => $is_extreme_cold ? 1 : 0, ':is_severe_weather' => isset($weather_data['alerts']) ? 1 : 0, ':weather_alerts' => isset($weather_data['alerts']) ? json_encode($weather_data['alerts']) : null, ]; try { $pdo = db(); $stmt = $pdo->prepare(" INSERT INTO weather (zip_code, location_name, observation_time, weather_condition, weather_description, weather_icon, temperature_f, feels_like_f, temp_min_f, temp_max_f, humidity_pct, wind_speed_mph, is_extreme_heat, is_extreme_cold, is_severe_weather, weather_alerts) VALUES (:zip_code, :location_name, :observation_time, :weather_condition, :weather_description, :weather_icon, :temperature_f, :feels_like_f, :temp_min_f, :temp_max_f, :humidity_pct, :wind_speed_mph, :is_extreme_heat, :is_extreme_cold, :is_severe_weather, :weather_alerts) ON DUPLICATE KEY UPDATE location_name = VALUES(location_name), observation_time = VALUES(observation_time), weather_condition = VALUES(weather_condition), weather_description = VALUES(weather_description), weather_icon = VALUES(weather_icon), temperature_f = VALUES(temperature_f), feels_like_f = VALUES(feels_like_f), temp_min_f = VALUES(temp_min_f), temp_max_f = VALUES(temp_max_f), humidity_pct = VALUES(humidity_pct), wind_speed_mph = VALUES(wind_speed_mph), is_extreme_heat = VALUES(is_extreme_heat), is_extreme_cold = VALUES(is_extreme_cold), is_severe_weather = VALUES(is_severe_weather), weather_alerts = VALUES(weather_alerts) "); $stmt->execute($weather_record); // Return the fresh data echo json_encode($weather_record); } catch (PDOException $e) { error_log("DB Error: " . $e->getMessage()); http_response_code(500); echo json_encode(['error' => 'Database error while saving weather data.']); }