'use strict';

const FindIndex = require('lodash.findindex');

module.exports = ({ deploymentGroups = [], services = [], instances = [] }) => {
  const getInstances = (serviceId) => {
    return (opts, cb) => {
      cb(null, instances
        .filter((instance) => {
          return instance.serviceId === serviceId;
        })
      );
    };
  };

  const getServices = (deploymentGroupId) => {
    return (opts, cb) => {
      cb(null, services
        .filter((service) => {
          return service.deploymentGroupId === deploymentGroupId;
        })
        .map((service) => {
          return Object.assign({}, service, {
            instances: getInstances(service.id)
          });
        })
      );
    };
  };

  const getDeploymentGroups = (opts, cb) => {
    cb(null, deploymentGroups
      .map((dg) => {
        return Object.assign({}, dg, {
          services: getServices(dg.id)
        });
      })
    );
  };

  const getPortal = (opts, cb) => {
    cb(null, {
      deploymentGroups: getDeploymentGroups
    });
  };

  const updateInstance = (instance, cb) => {
    const instanceIndex = FindIndex(instances, ['id', instance.id]);
    const updatedInstance = Object.assign(
      {},
      instances[instanceIndex],
      instance
    );

    instances[instanceIndex] = updatedInstance;
    return updatedInstance;
  };

  const updateService = (service, cb) => {
    const serviceIndex = FindIndex(service, ['id', service.id]);
    const updatedService = Object.assign({}, services[serviceIndex], service);

    services[serviceIndex] = updatedService;
    return updatedService;
  };

  return {
    getPortal,
    updateInstance,
    updateService
  };
};

