import * as Style from "../src/js/style.js";
import config from "../src/config.js";
import { Command, Option, OptionValues } from "commander";
import { LayerSpecification } from "@maplibre/maplibre-gl-style-spec";

const program = new Command();
program
  .option("-pp, --pretty", "pretty-print JSON output")
  .addOption(
    new Option(
      "-pg, --print-group <group prefix>",
      "print a list of the layers in a group"
    ).conflicts("printLayer")
  )
  .option("-pl, --print-layer <layer id>", "print the JSON of a layer")
  .option("-loc, --locales <locale1 locale2...>", "language codes", ["mul"]);
program.parse(process.argv);

const opts: OptionValues = program.opts();

if (Object.keys(opts).length === 1) program.help();

const locales = opts.locales[0].split(",");

const style = Style.build(
  config.OPENMAPTILES_URL,
  "https://americanamap.org/sprites/sprite",
  "https://font.americanamap.org/{fontstack}/{range}.pbf",
  locales
);

const layers = style.layers as LayerSpecification[];
const layerMap = new Map<string, LayerSpecification>();
const layerGroupMap = new Map<string, string[]>();

for (let i = 0; i < layers.length; i++) {
  const layer = layers[i];
  layerMap.set(layer.id, layers[i]);
  const layerGroup =
    layer["source-layer"] || (layer as any).source || layer.type;
  if (!layerGroupMap.has(layerGroup)) {
    layerGroupMap.set(layerGroup, [layer.id]);
  } else {
    const group = layerGroupMap.get(layerGroup);
    if (group) {
      group.push(layer.id);
    }
  }
}

let outputObj: string[] | LayerSpecification | undefined;

if (opts.printGroup) {
  outputObj = layerGroupMap.get(opts.printGroup);
}

if (opts.printLayer) {
  outputObj = layerMap.get(opts.printLayer) ?? undefined;
}

process.stdout.write(
  JSON.stringify(outputObj, null, opts.pretty ? 2 : undefined)
);
