const axios = require('axios');
const md5 = require('md5');
import moment from 'moment';
const _ = require('lodash');
let Promise = require('bluebird');
const debug = require('debug');

const info = debug(`weather-prism:info`);

async function fetch({years, lat, lon}) {
  if (!lat || !lon) {
    throw new Error(`Latitude ("lat") ${lat} or Longitude ("lon"): ${lon} value missing.`)
  }

  //Handle dates
  if (!years) {
    let end = moment().year() + 1;
    let start = end - 21;
    years = _.range(start, end);
    info(`Missing parameter "years". Defaulting to 20 years of data, i.e., years:${years}.`)
  }
  
  let data:any = {};
  let template:any = {
    pcpn: {
      units: "in"
    },
    maxt: {
      units: "degreeF"
    },
    mint: {
      units: "degreeF"
    },
    avgt: {
      units: "degreeF"
    },
    ggd: {
      units: "GDD Heat Units",
      base: {
        value: 50,
        units: "degreeF"
      }
    }
  }
  let tid = md5(JSON.stringify(template))
  template.id = tid;

  await Promise.each(years.sort(), async (year) => {
    info(`Processing year ${year}`)
    let response = await axios({
      method: "post",
      url: "https://data.rcc-acis.org/GridData",
      headers: {
        "Content-Type": "application/json"
      },
      data: {
        loc: `${lon}, ${lat}`,
        "sdate":`${year}-01-01`,
        "edate":`${year}-12-31`,
        "grid":"21",
        "elems":[{
          "name":"pcpn",
          "interval":"dly",
          "duration":1,
          "smry":"sum",
          "units":"inch"
        },{
          "name":"maxt",
          "interval":"dly",
          "duration":1,
          "smry":"sum",
          "units":"degreeF"
        },{
          "name":"mint",
          "interval":"dly",
          "duration":1,
          "smry":"sum",
          "units":"degreeF"
        },{
          "name":"avgt",
          "interval":"dly",
          "duration":1,
          "smry":"sum",
          "units":"degreeF"
        },{
          "name":"gdd",
          "interval":"dly",
          "duration":1,
          "smry":"sum",
          "units":"degreeF"
        }]
      }
    }).then(r => r.data.data)
    //.catch(r => undefined)

    if (response) {
      response.forEach(item => {
        let day = item[0];
        /*
        data["day-index"][day] = {
          pcpn: item[1],
          maxt: item[2],
          mint: item[3],
          avgt: item[4],
        };
        */
        data[day] = {
          pcpn: item[1],
          maxt: item[2],
          mint: item[3],
          avgt: item[4],
          gdd: item[5],
          time: moment(day).format(),
          template: tid
        };
      })
    }
  })
  return { data, template }
}

async function get(lon, lat, sdate, edate) {
  await axios({
    method: "post",
    url: "https://data.rcc-acis.org/GridData",
    headers: {
      "Content-Type": "application/json"
    },
    data: {
      loc: `${lon}, ${lat}`,
      sdate,
      edate,
      "grid":"21",
      "elems":[{
        "name":"pcpn",
        "interval":"dly",
        "duration":1,
        "smry":"sum",
        "units":"inch"
      },{
        "name":"maxt",
        "interval":"dly",
        "duration":1,
        "smry":"sum",
        "units":"degreeF"
      },{
        "name":"mint",
        "interval":"dly",
        "duration":1,
        "smry":"sum",
        "units":"degreeF"
      },{
        "name":"avgt",
        "interval":"dly",
        "duration":1,
        "smry":"sum",
        "units":"degreeF"
      },{
        "name":"gdd",
        "interval":"dly",
        "duration":1,
        "smry":"sum",
        "units":"degreeF"
      }]
    }
  }).then(r => r.data.data)
}

module.exports = {
  fetch,
  get
}
