// import data from './data';
import * as cloudflare from './cloudflare';
// import * as blacklist from './blacklist';

// function prunePackages(packagesMap) {
//   return Promise.all(
//     Object.keys(packagesMap).map(packageName =>
//       blacklist.includesPackage(packageName).then(blacklisted => {
//         if (blacklisted) {
//           delete packagesMap[packageName];
//         }
//       })
//     )
//   ).then(() => packagesMap);
// }

// export function createDayKey(date) {
//   return `${date.getUTCFullYear()}-${date.getUTCMonth()}-${date.getUTCDate()}`;
// }

// export function createHourKey(date) {
//   return `${createDayKey(date)}-${date.getUTCHours()}`;
// }

// export function createMinuteKey(date) {
//   return `${createHourKey(date)}-${date.getUTCMinutes()}`;
// }

// function createScoresMap(array) {
//   const map = {};

//   for (let i = 0; i < array.length; i += 2) {
//     map[array[i]] = parseInt(array[i + 1], 10);
//   }

//   return map;
// }

// function getScoresMap(key, n = 100) {
//   return new Promise((resolve, reject) => {
//     data.zrevrange(key, 0, n, 'withscores', (error, value) => {
//       if (error) {
//         reject(error);
//       } else {
//         resolve(createScoresMap(value));
//       }
//     });
//   });
// }

// function getPackageRequests(date, n = 100) {
//   return getScoresMap(`stats-packageRequests-${createDayKey(date)}`, n).then(
//     prunePackages
//   );
// }

// function getPackageBandwidth(date, n = 100) {
//   return getScoresMap(`stats-packageBytes-${createDayKey(date)}`, n).then(
//     prunePackages
//   );
// }

// function getProtocolRequests(date) {
//   return getScoresMap(`stats-protocolRequests-${createDayKey(date)}`);
// }

// function addDailyMetricsToTimeseries(timeseries) {
//   const since = new Date(timeseries.since);

//   return Promise.all([
//     getPackageRequests(since),
//     getPackageBandwidth(since),
//     getProtocolRequests(since)
//   ]).then(results => {
//     timeseries.requests.package = results[0];
//     timeseries.bandwidth.package = results[1];
//     timeseries.requests.protocol = results[2];
//     return timeseries;
//   });
// }

// function sumMaps(maps) {
//   return maps.reduce((memo, map) => {
//     Object.keys(map).forEach(key => {
//       memo[key] = (memo[key] || 0) + map[key];
//     });

//     return memo;
//   }, {});
// }

// function addDailyMetrics(result) {
//   return Promise.all(result.timeseries.map(addDailyMetricsToTimeseries)).then(
//     () => {
//       result.totals.requests.package = sumMaps(
//         result.timeseries.map(timeseries => {
//           return timeseries.requests.package;
//         })
//       );

//       result.totals.bandwidth.package = sumMaps(
//         result.timeseries.map(timeseries => timeseries.bandwidth.package)
//       );

//       result.totals.requests.protocol = sumMaps(
//         result.timeseries.map(timeseries => timeseries.requests.protocol)
//       );

//       return result;
//     }
//   );
// }

function extractPublicInfo(data) {
  return {
    since: data.since,
    until: data.until,
    requests: {
      all: data.requests.all,
      cached: data.requests.cached,
      country: data.requests.country,
      status: data.requests.http_status
    },
    bandwidth: {
      all: data.bandwidth.all,
      cached: data.bandwidth.cached,
      country: data.bandwidth.country
    },
    threats: {
      all: data.threats.all,
      country: data.threats.country
    },
    uniques: {
      all: data.uniques.all
    }
  };
}

const DomainNames = ['unpkg.com', 'npmcdn.com'];

function fetchStats(since, until) {
  return cloudflare.getZones(DomainNames).then(zones => {
    return cloudflare
      .getZoneAnalyticsDashboard(zones, since, until)
      .then(dashboard => {
        return {
          timeseries: dashboard.timeseries.map(extractPublicInfo),
          totals: extractPublicInfo(dashboard.totals)
        };
      });
  });
}

// const oneMinute = 1000 * 60;
// const oneHour = oneMinute * 60;
// const oneDay = oneHour * 24;

export function getStats(since, until) {
  const promise = fetchStats(since, until);
  // return until - since > oneDay ? promise.then(addDailyMetrics) : promise;
  return promise;
}