#!/usr/bin/node

// Usage:
//   Install all plugins defined in `../certbot/dns-plugins.json`:
//    ./install-certbot-plugins
//   Install one or more specific plugins:
//    ./install-certbot-plugins route53 cloudflare
//
// Usage with a running docker container:
//    docker exec npm_core /command/s6-setuidgid 1000:1000 bash -c "/app/scripts/install-certbot-plugins"
//

import batchflow from "batchflow";
import dnsPlugins from "../certbot/dns-plugins.json" with { type: "json" };
import { installPlugin } from "../lib/certbot.js";
import { certbot as logger } from "../logger.js";

let hasErrors = false;
const failingPlugins = [];

let pluginKeys = Object.keys(dnsPlugins);
if (process.argv.length > 2) {
	pluginKeys = process.argv.slice(2);
}

batchflow(pluginKeys)
	.sequential()
	.each((i, pluginKey, next) => {
		installPlugin(pluginKey)
			.then(() => {
				next();
			})
			.catch((err) => {
				hasErrors = true;
				failingPlugins.push(pluginKey);
				next(err);
			});
	})
	.error((err) => {
		logger.error(err.message);
	})
	.end(() => {
		if (hasErrors) {
			logger.error(
				"Some plugins failed to install. Please check the logs above. Failing plugins: " +
					"\n - " +
					failingPlugins.join("\n - "),
			);
			process.exit(1);
		} else {
			logger.complete("Plugins installed successfully");
			process.exit(0);
		}
	});
