/*
	MIT License http://www.opensource.org/licenses/mit-license.php
	Author Tobias Koppers @sokra
*/
"use strict";

const forEachBail = require("./forEachBail");
const getPaths = require("./getPaths");

module.exports = class ModulesInHierachicDirectoriesPlugin {
	constructor(source, directories, target) {
		this.source = source;
		this.directories = [].concat(directories);
		this.target = target;
	}

	apply(resolver) {
		const target = resolver.ensureHook(this.target);
		resolver.getHook(this.source).tapAsync("ModulesInHierachicDirectoriesPlugin", (request, resolveContext, callback) => {
			const fs = resolver.fileSystem;
			const addrs = getPaths(request.path).paths.map(p => {
				return this.directories.map(d => resolver.join(p, d));
			}).reduce((array, p) => {
				array.push.apply(array, p);
				return array;
			}, []);
			forEachBail(addrs, (addr, callback) => {
				fs.stat(addr, (err, stat) => {
					if(!err && stat && stat.isDirectory()) {
						const obj = Object.assign({}, request, {
							path: addr,
							request: "./" + request.request
						});
						const message = "looking for modules in " + addr;
						return resolver.doResolve(target, obj, message, resolveContext, callback);
					}
					if(resolveContext.log) resolveContext.log(addr + " doesn't exist or is not a directory");
					if(resolveContext.missing) resolveContext.missing.add(addr);
					return callback();
				});
			}, callback);
		});
	}
};
