import { ChatUtility } from "./chat-utility.js"
import { renderTemplate } from "./constants.js"

const vents = [
  { min: 0, max: 0, valeur: 'Calme' },
  { min: 1, max: 1, valeur: 'Légère brise' },
  { min: 2, max: 2, valeur: 'Jolie brise' },
  { min: 3, max: 3, valeur: 'Bonne brise' },
  { min: 4, max: 4, valeur: 'Vent frais' },
  { min: 5, max: 5, valeur: 'Coup de vent' },
  { min: 6, max: 6, valeur: 'Fort coup de vent' },
  { min: 7, max: 9, valeur: 'Tempête' },
  { min: 10, max: 13, valeur: 'Violente tempête' },
  { min: 14, valeur: 'Ouragan' },
]
const mers = [
  { min: 0, max: 0, valeur: 'Calme' },
  { min: 1, max: 1, valeur: 'Belle' },
  { min: 2, max: 2, valeur: 'Peu agitée' },
  { min: 3, max: 3, valeur: 'Agitée' },
  { min: 4, max: 4, valeur: 'Forte' },
  { min: 5, max: 6, valeur: 'Très forte' },
  { min: 7, max: 9, valeur: 'Grosse' },
  { min: 10, max: 13, valeur: 'Très grosse' },
  { min: 14, valeur: 'Énorme' },
]

const nuages = [
  { min: 0, max: 3, valeur: 'dégagé' },
  { min: 4, max: 6, valeur: 'passages nuageux' },
  { min: 7, max: 9, valeur: 'nuageux',  },
  { min: 10, max: 10, valeur: 'brouillard' },
  { min: 11, max: 12, valeur: 'bruine' },
  { min: 13, valeur: 'très nuageux' },
]

const pluies = [
  { min: 0, max: 4, valeur: 'aucune' },
  { min: 5, max: 5, valeur: 'bruine, crachin, éparse' },
  { min: 6, max: 7, valeur: 'averses' },
  { min: 8, max: 10, valeur: 'pluvieux', },
  { min: 11, max: 13, valeur: 'forte pluie' },
  { min: 14, valeur: 'déluge' },
]

const temperatures = [
  { max: -14, valeur: 'glaciale' },
  { min: -13, max: -10, valeur: 'Très froide' },
  { min: -9, max: -7, valeur: 'froide' },
  { min: -6, max: -4, valeur: 'fraîche' },
  { min: -3, max: 3, valeur: 'de saison' },
  { min: 4, max: 6, valeur: 'élevée' },
  { min: 7, max: 9, valeur: 'chaude' },
  { min: 10, max: 13, valeur: 'torride' },
  { min: 14, valeur: 'caniculaire' },
]

export class RdDMeteo {
  static async getForce() {
    const roll = new Roll(`1dr`);
    await roll.evaluate();
    return roll.total;
  }

  static async getPluie(nuage) {
    return nuage <= 3 ? 0 : await RdDMeteo.getForce();
  }

  static async getTemperature() {
    const degre = await RdDMeteo.getForce();
    const rollChaudFroid = new Roll('1d2');
    await rollChaudFroid.evaluate();
    const chaudFroid = rollChaudFroid.total == 1;
    return chaudFroid.total ? degre : -degre;
  }

  static async getDirection(direction) {
    const roll = new Roll(`1d16`);
    await roll.evaluate();
    switch (roll.total % 16) {
      case 0: return 'Nord';
      case 1: return 'Nord Nord Est';
      case 2: return 'Nord Est';
      case 3: return 'Est Nord Est';
      case 4: return 'Est';
      case 5: return 'Est Sud Est';
      case 6: return 'Sud Est';
      case 7: return 'Sud Sud Est';
      case 8: return 'Sud';
      case 9: return 'Sud Sud Ouest';
      case 10: return 'Sud Ouest';
      case 11: return 'Ouest Sud Ouest';
      case 12: return 'Ouest';
      case 13: return 'Ouest Nord Ouest';
      case 14: return 'Nord Ouest';
      case 15: return 'Nord Nord Ouest';
    }
    return undefined;
  }

  static async getMeteo() {
    const vent = await RdDMeteo.getForce();
    const mer = await RdDMeteo.getForce();
    const nuage = await RdDMeteo.getForce();
    const pluie = await RdDMeteo.getPluie(nuage);
    const temperature = await RdDMeteo.getTemperature();
    const meteo = {
      vent: { force: vent, direction: await RdDMeteo.getDirection(), },
      mer: { force: mer, direction: await RdDMeteo.getDirection(), },
      temperature: { force: temperature },
      nuage: { force: nuage, },
      pluie: { force: pluie },
    }
    meteo.vent.description = RdDMeteo.vent(meteo.vent.force);
    meteo.mer.description = RdDMeteo.mer(meteo.mer.force),
    meteo.temperature.description = RdDMeteo.temperature(meteo.temperature.force);
    meteo.nuage.description = RdDMeteo.nuage(meteo.nuage.force);
    meteo.pluie.description = RdDMeteo.pluie(meteo.pluie.force);

    await ChatMessage.create({
      content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-meteo.hbs', meteo),
      whisper: ChatUtility.getGMs()
    });
  }

  static description(liste, force, valeur = it => it.valeur) {
    let select = liste.find(it => (it.min == undefined || it.min <= force) && (it.max == undefined || force <= it.max));
    return valeur(select ?? liste[0]);
  }

  static vent(force) { return this.description(vents, force); }
  static mer(force) { return this.description(mers, force); }
  static nuage(force) { return this.description(nuages, force); }
  static pluie(force) { return this.description(pluies, force); }
  static temperature(force) { return this.description(temperatures, force); }
}