"use strict";
var path = require('path');
var Q = require('q');

var services = {};

var cache = {};

require("fs").readdirSync(path.join(__dirname, "..", "lib", "services")).forEach(function(file) {
  var service = require("../lib/services/" + file);
  if (service.search) {
    services[service.id] = service;
    cache[service.id] = {};
  }
});

module.exports = function(req, res) {
  var serviceId = req.params.service;
  var type = req.params.type;
  var itemId = req.params.id;
  var promises = [];

  if (cache[serviceId][type + "-" + itemId]) {
    res.render(type, {items: cache[serviceId][type + "-" + itemId]});
    return;
  }

  services[serviceId].lookupId(itemId, type).then(function(item) {
    for (var id in services) {
      if (id != serviceId) {
        promises.push(services[id].search(item));
      }
    }

    Q.allSettled(promises).then(function(results) {
      var items = results.map(function(result) {
        if (result.state == "fulfilled") {
          return result.value;
        }
      });

      items.sort(function(a, b) {
        return !a.id || !b.id;
      }).sort(function(a, b) {
        return !a.streamUrl || b.streamUrl;
      });

      items.unshift(item);
      cache[serviceId][item.type + "-" + item.id] = items;
      res.render(type, {items: items});
    });
  });
};