import fs from "fs";
import path from "path";
import os from "os";
import { Config, GlobalConfig } from "./types";

export const isDevMode = Boolean(process.env.RAILWAY_DEV);

export const railwayUrl = isDevMode
  ? "http://localhost:3000"
  : "https://railway.app";

export const backboardUrl = isDevMode
  ? "http://localhost:8082"
  : "https://backboard.railway.app:8082/";

const dir = "./.railway";
export const railwayPath = path.resolve(dir);
export const paths = {
  railwayPath,
  configFilePath: path.resolve(railwayPath, "./config.json"),
  gitIgnoreFilePath: path.resolve(railwayPath, "./.gitignore"),
  railwayEnvFilePath: path.resolve(railwayPath, "./env.json"),
  nodeEnvFilePath: path.resolve(__dirname, "../pg/env.json"),
};

const defaultConfig: Config = {};

export const configExists = (): boolean => {
  return fs.existsSync(paths.configFilePath);
};

export const getConfig = (): Config => {
  if (!fs.existsSync(paths.configFilePath)) {
    return defaultConfig;
  }

  const file = fs.readFileSync(paths.configFilePath, "utf8");

  try {
    const config = JSON.parse(file);
    return config;
  } catch (e) {
    throw new Error(`Error parsing config file: ${paths.configFilePath}`);
  }
};

export const createConfig = (
  projectId: string,
  environmentId: string,
  force?: boolean,
) => {
  if (!force && fs.existsSync(paths.configFilePath)) {
    throw new Error("./railway/config.json file already exists");
  }

  if (!fs.existsSync(railwayPath)) {
    fs.mkdirSync(railwayPath);

    const gitIgnore = `# The .railway directory should not be commited
*
`;
    fs.writeFileSync(paths.gitIgnoreFilePath, gitIgnore, "utf8");
  }

  const contents: Config = {
    project: projectId,
    environment: environmentId,
  };

  fs.writeFileSync(paths.configFilePath, JSON.stringify(contents, null, 2));
};

export const useEnvironment = (envId: string) => {
  const config = getConfig();

  if (config.project == null) {
    throw new Error("Cannot use environment without project");
  }

  createConfig(config.project, envId, true);
};

export const loginWebpage = (port: number, code: string): string => {
  const buff = Buffer.from(`port=${port}&code=${code}`);
  const data = buff.toString("base64");
  return `${railwayUrl}/cli-login?d=${data}`;
};

export const globalConfigDir = path.resolve(os.homedir(), ".railway");
export const globalConfigFile = path.join(globalConfigDir, "config.json");

export const getGlobalConfig = (): GlobalConfig => {
  if (!fs.existsSync(globalConfigFile)) {
    return {};
  }

  try {
    const contents = fs.readFileSync(globalConfigFile, "utf8");
    const config = JSON.parse(contents);
    return config;
  } catch (e) {
    fs.unlinkSync(globalConfigFile);
  }

  return {};
};

export const saveGlobalConfig = (config: GlobalConfig) => {
  if (!fs.existsSync(globalConfigDir)) {
    fs.mkdirSync(globalConfigDir);
  }

  fs.writeFileSync(globalConfigFile, JSON.stringify(config), "utf8");
};

export const removeTokenFromGlobalConfig = () => {
  const config = getGlobalConfig();
  delete config.token;
  saveGlobalConfig(config);
};

export const railwayProductionToken = process.env.RAILWAY_PRODUCTION_TOKEN;
