import * as fs from "fs";
import * as path from "path";
import { prisma } from "./prisma";

/**
 * In-process equivalent of prisma/ensureExerciseLibrary.cjs (which runs at
 * container boot via docker_entrypoint.sh). Used when a new user signs up
 * mid-runtime so they don't have to wait for the next boot to see the
 * curated library.
 *
 * Reads the curated library from prisma/exercises.seed.json, then upserts
 * each entry for the given user. Idempotent; never overwrites a user's
 * own custom exercises (the unique constraint on (userId, name) prevents
 * duplicates and `update: {}` on upsert keeps existing rows untouched).
 */

interface LibraryExercise {
  name: string;
  description: string | null;
  type: string;
  muscleGroups: string[];
  inputFields: string[];
  defaultWeightUnit: string | null;
}

let cached: LibraryExercise[] | null = null;

function loadLibrary(): LibraryExercise[] {
  if (cached) return cached;
  const candidates = [
    // standalone runtime (Next.js server.js / Node)
    path.resolve(process.cwd(), "prisma/exercises.seed.json"),
    // .next/standalone runtime
    path.resolve(process.cwd(), "../prisma/exercises.seed.json"),
    // dev: cwd is repo subdir
    path.resolve(__dirname, "../prisma/exercises.seed.json"),
  ];
  for (const p of candidates) {
    if (fs.existsSync(p)) {
      cached = JSON.parse(fs.readFileSync(p, "utf8")) as LibraryExercise[];
      return cached;
    }
  }
  console.warn("[library] exercises.seed.json not found in any candidate path");
  return [];
}

export async function ensureLibraryForUser(userId: string): Promise<number> {
  const library = loadLibrary();
  let inserted = 0;
  for (const ex of library) {
    const result = await prisma.exercise.upsert({
      where: { userId_name: { userId, name: ex.name } },
      update: {},
      create: {
        userId,
        name: ex.name,
        description: ex.description,
        muscleGroups: JSON.stringify(ex.muscleGroups),
        type: ex.type,
        inputFields: JSON.stringify(ex.inputFields),
        defaultWeightUnit: ex.defaultWeightUnit,
        isCustom: false,
      },
    });
    if (result) inserted++;
  }
  return inserted;
}
