(() => {
  const weather = require('weather');
  
  var dirty = false;
  
  let settings;

  function loadSettings() {
    settings = require('Storage').readJSON('weather.json', 1) || {};
  }

  function setting(key) {
    if (!settings) { loadSettings(); }
    const DEFAULTS = {
      'expiry': 2*3600000,
      'hide': false
    };
    return (key in settings) ? settings[key] : DEFAULTS[key];
  }

  weather.on("update", w => {
    if (setting('hide')) return;
    if (w) {
      if (!WIDGETS["weather"].width) {
        WIDGETS["weather"].width = 20;
        Bangle.drawWidgets();
      } else if (Bangle.isLCDOn()) {
        WIDGETS["weather"].draw();
      } else {
        dirty = true;
      }
    }
    else {
      WIDGETS["weather"].width = 0;
      Bangle.drawWidgets();
    }
  });

  Bangle.on('lcdPower', on => {
    if (on && dirty && !setting('hide')) {
      WIDGETS["weather"].draw();
      dirty = false;
    }
  });

  WIDGETS["weather"] = {
    area: "tl",
    width: weather.get() && !setting('hide') ? 20 : 0,
    draw: function() {
      if (setting('hide')) return;
      const w = weather.get();
      if (!w) return;
      g.reset();
      g.clearRect(this.x, this.y, this.x+this.width-1, this.y+23);
      if (w.code||w.txt) {
        weather.drawIcon(w, this.x+10, this.y+8, 7.5);
      }
      if (w.temp) {
        let t = require('locale').temp(w.temp-273.15);  // applies conversion
        t = t.match(/[\d\-]*/)[0]; // but we have no room for units
        g.reset();
        g.setFontAlign(0, 1); // center horizontally at bottom of widget
        g.setFont('6x8', 1);
        g.drawString(t, this.x+10, this.y+24);
      }
    },
    reload:function() {
      loadSettings();
      WIDGETS["weather"].redraw();
    },
  };
})();
