/**
 * Script Google Ads - Ajustements météorologiques
 * Version: 1.0
 * Date: 2025
 */

// Configuration globale
var CONFIG = {
  // Paramètres API météo
  WEATHER_API_KEY: 'VOTRE_CLE_API_OPENWEATHERMAP',
  LOCATIONS: [
    { city: 'Paris', lat: 48.8566, lon: 2.3522 },
    { city: 'Lyon', lat: 45.7578, lon: 4.8320 }
  ],
  
  // Paramètres d'ajustement
  WEATHER_ADJUSTMENTS: {
    'Rain': -20,     // Réduire les enchères de 20% par temps de pluie
    'Clear': 15,     // Augmenter les enchères de 15% par temps clair
    'Snow': -30,     // Réduire les enchères de 30% par temps de neige
    'Clouds': 0      // Pas d'ajustement par temps nuageux
  },
  
  // Paramètres de température
  TEMP_ADJUSTMENTS: {
    'HOT': {         // Au-dessus de 25°C
      threshold: 25,
      adjustment: 20
    },
    'COLD': {        // En dessous de 5°C
      threshold: 5,
      adjustment: -10
    }
  },
  
  // Campagnes à exclure
  EXCLUDED_CAMPAIGNS: ['Brand', 'Remarketing'],
  
  // Email pour les rapports
  EMAIL_RECIPIENT: 'votre@email.com'
};

function main() {
  try {
    // Récupération des données météo pour chaque localisation
    var weatherData = getAllLocationsWeather();
    
    // Application des ajustements pour chaque localisation
    weatherData.forEach(function(location) {
      applyWeatherAdjustments(location);
    });
    
    // Envoi du rapport
    sendWeatherReport(weatherData);
    
  } catch (e) {
    Logger.log('Erreur dans l\'exécution du script : ' + e);
    MailApp.sendEmail(CONFIG.EMAIL_RECIPIENT, 
                     'Erreur Script Météo Google Ads', 
                     'Une erreur est survenue : ' + e);
  }
}

function getAllLocationsWeather() {
  return CONFIG.LOCATIONS.map(function(location) {
    var weatherData = getWeatherData(location.lat, location.lon);
    weatherData.city = location.city;
    return weatherData;
  });
}

function getWeatherData(lat, lon) {
  var url = 'http://api.openweathermap.org/data/2.5/weather?lat=' + lat +
            '&lon=' + lon + '&appid=' + CONFIG.WEATHER_API_KEY + '&units=metric';
  
  var response = UrlFetchApp.fetch(url);
  var data = JSON.parse(response.getContentText());
  
  return {
    weather: data.weather[0].main,
    temperature: data.main.temp,
    humidity: data.main.humidity,
    windSpeed: data.wind.speed
  };
}

function applyWeatherAdjustments(locationData) {
  // Récupération des campagnes géolocalisées
  var campaigns = AdsApp.campaigns()
    .withCondition('Status = ENABLED')
    .withCondition('CampaignName CONTAINS_IGNORE_CASE "' + locationData.city + '"')
    .get();
  
  while (campaigns.hasNext()) {
    var campaign = campaigns.next();
    
    // Vérification des exclusions
    if (CONFIG.EXCLUDED_CAMPAIGNS.indexOf(campaign.getName()) !== -1) {
      continue;
    }
    
    // Calcul de l'ajustement total
    var totalAdjustment = calculateTotalAdjustment(locationData);
    
    // Application de l'ajustement
    applyBidAdjustment(campaign, totalAdjustment, locationData);
  }
}

function calculateTotalAdjustment(locationData) {
  var weatherAdjustment = CONFIG.WEATHER_ADJUSTMENTS[locationData.weather] || 0;
  var tempAdjustment = getTemperatureAdjustment(locationData.temperature);
  
  // Combinaison des ajustements (weather + temperature)
  var totalAdjustment = weatherAdjustment + tempAdjustment;
  
  // Limitation des ajustements entre -90% et +90%
  return Math.min(Math.max(totalAdjustment, -90), 90);
}

function getTemperatureAdjustment(temperature) {
  if (temperature >= CONFIG.TEMP_ADJUSTMENTS.HOT.threshold) {
    return CONFIG.TEMP_ADJUSTMENTS.HOT.adjustment;
  } else if (temperature <= CONFIG.TEMP_ADJUSTMENTS.COLD.threshold) {
    return CONFIG.TEMP_ADJUSTMENTS.COLD.adjustment;
  }
  return 0;
}

function applyBidAdjustment(campaign, adjustment, locationData) {
  var currentBidModifier = 1 + (adjustment / 100);
  
  try {
    // Application de l'ajustement au niveau de la campagne
    campaign.setBidModifier(currentBidModifier);
    
    Logger.log('Campagne: ' + campaign.getName() + 
              ' | Ville: ' + locationData.city +
              ' | Météo: ' + locationData.weather +
              ' | Température: ' + locationData.temperature + '°C' +
              ' | Ajustement: ' + adjustment + '%');
              
  } catch (e) {
    Logger.log('Erreur lors de l\'ajustement pour ' + campaign.getName() + ': ' + e);
  }
}

function sendWeatherReport(weatherData) {
  var reportBody = 'Rapport des ajustements météorologiques\n\n';
  
  weatherData.forEach(function(location) {
    reportBody += 'Ville: ' + location.city + '\n';
    reportBody += 'Météo: ' + location.weather + '\n';
    reportBody += 'Température: ' + location.temperature + '°C\n';
    reportBody += 'Humidité: ' + location.humidity + '%\n';
    reportBody += 'Vitesse du vent: ' + location.windSpeed + ' m/s\n\n';
  });
  
  MailApp.sendEmail({
    to: CONFIG.EMAIL_RECIPIENT,
    subject: 'Rapport Météo Google Ads - ' + new Date().toLocaleDateString(),
    body: reportBody
  });
}

/**
 * Fonction utilitaire pour formater la date
 */
function formatDate(date) {
  return Utilities.formatDate(date, AdsApp.currentAccount().getTimeZone(), 'yyyy-MM-dd HH:mm:ss');
}

Ce script : 
	1.	Récupère les données météo pour chaque ville configurée 
	2.	Analyse les conditions météorologiques (pluie, soleil, neige, etc.) 
	3.	Ajuste les enchères en fonction de :
	◦	La météo actuelle 
	◦	La température 
	◦	Des seuils configurés 
Pour l'utiliser : 
	1.	Créez un compte sur OpenWeatherMap et obtenez une clé API 
	2.	Remplacez VOTRE_CLE_API_OPENWEATHERMAP par votre clé 
	3.	Configurez vos villes dans LOCATIONS
	4.	Ajustez les pourcentages dans WEATHER_ADJUSTMENTS et TEMP_ADJUSTMENTS
	5.	Définissez votre email dans EMAIL_RECIPIENT
Points importants : 
	•	Le script envoie un rapport quotidien par email 
	•	Les ajustements sont limités entre -90% et +90% 
	•	Les campagnes listées dans EXCLUDED_CAMPAIGNS sont ignorées 
	•	Les logs détaillent chaque ajustement 
Recommandations : 
	1.	Testez d'abord sur une campagne test 
	2.	Vérifiez les logs quotidiennement au début 
	3.	Ajustez les seuils selon vos résultats