#! /usr/bin/env node
import path from "path";
import fs from "fs";
import os from "os";
import meow from "meow";
import chalk from "chalk";
import { getKodiFolder, ConfigFile } from "../index";
import Operations from "../operations";

function warnOfInvalidOption(invalid: string, valid: string[]): void {
  const opts = valid.map(s => chalk.green(s)).join(", ");
  invalid ? console.log(`Invalid option ${chalk.red(invalid || "")}`) : null;
  console.log(`Options: ${opts}`);
}

function generateDefaultConfig(configPath: string): void {
  const obj = {
    directories: [],
    ignoreList: [],
    kodi: "",
    searchTerms: {
      sources: [],
      tags: [],
      people: []
    },
    configPath
  };
  fs.writeFileSync(configPath, JSON.stringify(obj, null, " "));
}

function getConfig(): ConfigFile {
  const configPath = path.join(os.homedir(), ".kodilist.json");
  if (!fs.existsSync(configPath)) generateDefaultConfig(configPath);
  const config: ConfigFile = JSON.parse(fs.readFileSync(configPath).toString());
  config.save = () =>
    fs.writeFileSync(configPath, JSON.stringify(config, null, " "));
  if (config.kodi === "" || config.kodi === "MISSING") {
    config.kodi = getKodiFolder();
    config.save();
  }
  if (config.kodi === "MISSING") {
    console.error("Could not find Kodi installed in the default path");
    process.exit(1);
  }
  return config;
}

const cli = meow(
  `
    Usage
      $ kodilist ${chalk.green("<command>")} ${chalk.blue("[...terms]")}

    Examples
      $ kodilist generate
      ${chalk.green("✔️")} ~/videos
      ${chalk.green("✔️")} /media/birds/video
      ${chalk.green("✔️")} sources           
      ${chalk.green("✔️")} tags              
      ${chalk.green("✔️")} people            
      ${chalk.green("✔️")} this week's files 
      ${chalk.green("✔️")} alphabetical files

      $ kodilist add tag rainbow lorikeet
      Now tracking ${chalk.green("rainbow lorikeet")}

      $ kodilist add person Dan Koeppel
      Now tracking ${chalk.green("Dan Koeppel")}

      $ kodilist add source bbc.co.uk
      Now tracking ${chalk.green("bbc.co.uk")}

      $ kodilist list people
      dan koeppel
      phoebe snetsinger

      $ kodilist ignore *.gif
      Now ignoring ${chalk.green("*.gif")}

      $ kodilist delete person Dan Koeppel
      Stopped tracking ${chalk.green("Dan Koeppel")}
`,
  {
    version: "1.1.3"
  }
);

function main() {
  const config = getConfig();
  if (cli.input.length === 0) return cli.showHelp();
  const operations = Operations(config, cli.input);
  if (!operations.hasOwnProperty(cli.input[0])) {
    return warnOfInvalidOption(cli.input[0], Object.keys(operations));
  }
  const cmd = operations[cli.input[0]];
  if (typeof cmd === "function") return cmd(cli.input.slice(1));
  if (!cmd.hasOwnProperty(cli.input[1])) {
    return warnOfInvalidOption(cli.input[1], Object.keys(cmd));
  }
  cmd[cli.input[1]](cli.input.slice(2));
}

main();
