import fs from "fs";
import path from "path";
import { assetRelocator, copy } from "./copy";
import { TemplateFramework } from "./types";

function renderDevcontainerContent(
  templatesDir: string,
  framework: TemplateFramework,
) {
  const devcontainerJson: any = JSON.parse(
    fs.readFileSync(path.join(templatesDir, "devcontainer.json"), "utf8"),
  );

  // Modify postCreateCommand
  devcontainerJson.postCreateCommand =
    framework === "fastapi" ? "poetry install" : "npm install";

  // Modify containerEnv
  if (framework === "fastapi") {
    devcontainerJson.containerEnv = {
      ...devcontainerJson.containerEnv,
      PYTHONPATH: "${PYTHONPATH}:${workspaceFolder}",
    };
  }

  return JSON.stringify(devcontainerJson, null, 2);
}

export const writeDevcontainer = async (
  root: string,
  templatesDir: string,
  framework: TemplateFramework,
) => {
  const devcontainerDir = path.join(root, ".devcontainer");
  if (fs.existsSync(devcontainerDir)) {
    console.log("Template already has a .devcontainer. Using it.");
    return;
  }
  const devcontainerContent = renderDevcontainerContent(
    templatesDir,
    framework,
  );
  fs.mkdirSync(devcontainerDir);
  await fs.promises.writeFile(
    path.join(devcontainerDir, "devcontainer.json"),
    devcontainerContent,
  );
};

export const copyVSCodeSettings = async (
  root: string,
  templatesDir: string,
) => {
  const vscodeDir = path.join(root, ".vscode");
  await copy("vscode_settings.json", vscodeDir, {
    cwd: templatesDir,
    rename: assetRelocator,
  });
};

export const configVSCode = async (
  root: string,
  templatesDir: string,
  framework: TemplateFramework,
) => {
  await writeDevcontainer(root, templatesDir, framework);
  if (framework === "fastapi") {
    await copyVSCodeSettings(root, templatesDir);
  }
};