import path from "path";
import { BotConfig, Nation } from "../types";
import { Store } from "@systems/store";
import { Paths } from "@helpers/paths";


// Function instead of const so env vars are read lazily at call time
function getDefaults(): Required<BotConfig> {
  return {
    officerRoles:             ["Ice King"],
    configRoles:              ["Ice King"],
    tagRoles:                 ["Ice King", "Ice", "Rebellion"],
    lockMessage:              "🔒 This poll has been locked.",
    confirmYesMessage:        "⚔️ TG is confirmed for tonight!",
    confirmNoMessage:         "❌ TG is cancelled for tonight.",
    pollChannelId:            process.env.POLL_CHANNEL_ID ?? "",
    resultsChannelId:         process.env.RESULTS_CHANNEL_ID ?? "",
    scoreChannelId:           process.env.SCORE_CHANNEL_ID ?? "",
    slots: [
      { tgHour: 20, pollOpens: "10:00", closesAfter: 35, active: true },
    ],
    scoreWindowHours:         2,
    tgDurationMinutes:        35,
    nationSource:             Nation.Procyon,
    wRankPostOnReset:         false,
    wRankGoal:                7,
    wRankYellowColor:         "#BA7517",
    wRankGrayColor:           "#888888",
    deltaUpColor:             "#A32D2D",
    deltaDownColor:           "#185FA5",
    stormBringerColor:        "#185FA5",
    luminousBringerColor:     "#8B4CB8",
    showClassInMessages:      false,
    showLevelInMessages:      false,
    charDisplayFormat:        "{wrank} {class} {level} {name}",
    showNationTotalsInHeader: false,
    showNoInNationField:      false,
    borrowRequestExpiryMs:    0,        // 0 = never expire
    conflictReclaimBehavior: "revert",
  };
}

let _cfg: BotConfig = {};

export function loadConfig(): void {
  _cfg = Store.readOrDefault(Paths.data("config.json"), {});
}
export function saveConfig(): void {
  Store.write(Paths.data("config.json"), _cfg);
}

export function cfg<K extends keyof BotConfig>(key: K): Required<BotConfig>[K] {
  return (_cfg[key] !== undefined ? _cfg[key] : getDefaults()[key]) as Required<BotConfig>[K];
}

export function setCfg<K extends keyof BotConfig>(key: K, value: BotConfig[K]): void {
  _cfg[key] = value;
  saveConfig();
}

export function resetCfg<K extends keyof BotConfig>(key: K): void {
  delete _cfg[key];
  saveConfig();
}