import pg, { QueryResultRow, QueryResult } from "pg";
import fs from "fs";
import path from "path";

const railwayEnvBuildPath = path.resolve(process.cwd(), "./.railway/env.json");

let nodeModulesEnv: any = null;
try {
  nodeModulesEnv = require("./env.json");
} catch (e) {
  // do nothing
}

const getEnvFromFile = () => {
  if (nodeModulesEnv != null) {
    return nodeModulesEnv;
  }

  if (fs.existsSync(railwayEnvBuildPath)) {
    return JSON.parse(fs.readFileSync(railwayEnvBuildPath, "utf8"));
  }

  return {};
};

const builtConfig = getEnvFromFile();

process.env = { ...builtConfig, ...process.env };

const client = new pg.Pool();

const query = <R extends QueryResultRow = any>(
  statement: string,
  cb: (err: Error, result: QueryResult<R>) => void,
) => {
  client.query(statement, cb);
};

const connect = () => {
  client.connect();
};

const close = () => {
  client.end();
};

const postgres = {
  query,
  close,
  connect,
  client,
  config: {
    host: process.env.PGHOST,
    port: process.env.PGPORT,
    user: process.env.PGUSER,
    password: process.env.PGPASSWORD,
    database: process.env.PGDATABASE,
    url: process.env.DATABASE_URL,
  },
};

export default postgres;
