import { mkdir, readFile, writeFile } from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import type { SettingsConfig } from "@skola/shared";

const SETTINGS_DIRECTORY = path.join(os.homedir(), "Documents", "Skola");
const SETTINGS_FILE_PATH = path.join(SETTINGS_DIRECTORY, "settings.json");

const DEFAULT_SETTINGS: SettingsConfig = {
  defaultCitationStyle: "APA7",
  crossrefMailto: "",
  openalexEmail: ""
};

async function ensureSettingsDirectory(): Promise<void> {
  await mkdir(SETTINGS_DIRECTORY, { recursive: true });
}

export async function getSettings(): Promise<SettingsConfig> {
  await ensureSettingsDirectory();

  try {
    const raw = await readFile(SETTINGS_FILE_PATH, "utf8");
    if (!raw.trim()) return { ...DEFAULT_SETTINGS };
    const parsed = JSON.parse(raw) as Partial<SettingsConfig>;
    return {
      defaultCitationStyle: parsed.defaultCitationStyle ?? DEFAULT_SETTINGS.defaultCitationStyle,
      crossrefMailto: parsed.crossrefMailto ?? DEFAULT_SETTINGS.crossrefMailto,
      openalexEmail: parsed.openalexEmail ?? DEFAULT_SETTINGS.openalexEmail
    };
  } catch {
    // File doesn't exist or is unreadable — return defaults
    return { ...DEFAULT_SETTINGS };
  }
}

export async function saveSettings(partial: Partial<SettingsConfig>): Promise<SettingsConfig> {
  const current = await getSettings();
  const updated: SettingsConfig = {
    defaultCitationStyle: partial.defaultCitationStyle ?? current.defaultCitationStyle,
    crossrefMailto: partial.crossrefMailto ?? current.crossrefMailto,
    openalexEmail: partial.openalexEmail ?? current.openalexEmail
  };

  await ensureSettingsDirectory();
  await writeFile(SETTINGS_FILE_PATH, JSON.stringify(updated, null, 2), "utf8");

  return updated;
}
