import { defineConfig } from "drizzle-kit";
import { existsSync, readFileSync } from "fs";
import path from "path";

const externalEnvKeys = new Set(Object.keys(process.env));

function loadEnvFile(filePath: string): void {
  if (!existsSync(filePath)) return;

  for (const line of readFileSync(filePath, "utf8").split(/\r?\n/)) {
    const trimmed = line.trim();
    if (!trimmed || trimmed.startsWith("#")) continue;

    const separator = trimmed.indexOf("=");
    if (separator <= 0) continue;

    const key = trimmed.slice(0, separator).trim();
    let value = trimmed.slice(separator + 1).trim();

    if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) continue;

    if (
      (value.startsWith('"') && value.endsWith('"')) ||
      (value.startsWith("'") && value.endsWith("'"))
    ) {
      value = value.slice(1, -1);
    }

    if (!externalEnvKeys.has(key)) {
      process.env[key] = value;
    }
  }
}

function loadWorkspaceEnv(): void {
  let current = process.cwd();

  while (true) {
    loadEnvFile(path.join(current, ".env"));
    loadEnvFile(path.join(current, ".env.local"));

    const parent = path.dirname(current);
    if (parent === current) return;
    current = parent;
  }
}

loadWorkspaceEnv();

const databaseUrl = process.env.DATABASE_URL;

if (!databaseUrl) {
  throw new Error("DATABASE_URL, ensure the database is provisioned");
}

function getPgliteDataDir(url: string): string | null {
  if (!url.startsWith("pglite:")) return null;

  const dataDir = url.slice("pglite:".length).replace(/^\/\//, "");
  if (!dataDir || dataDir === ":memory:") return dataDir || ":memory:";

  return path.resolve(process.cwd(), "..", "..", dataDir);
}

const pgliteDataDir = getPgliteDataDir(databaseUrl);

export default defineConfig({
  schema: "./src/schema/linkedin.ts",
  dialect: "postgresql",
  ...(pgliteDataDir ? { driver: "pglite" as const } : {}),
  dbCredentials: {
    url: pgliteDataDir ?? databaseUrl,
  },
});
