import fs from "fs";
import path from "path";

const DATA_DIR = process.env.DATA_DIR
  ? path.resolve(process.env.DATA_DIR)
  : path.resolve(process.cwd(), "data");
const STATE_FILE = path.join(DATA_DIR, "state.json");
const PARTICIPANTS_FILE = path.join(DATA_DIR, "participants.csv");

export interface PrizeCounters {
  revestimento: number;
  alinhamento: number;
  convite_pista: number;
  camarote_barretao: number;
  treinamento_bombas: number;
}

export interface EnabledFlags {
  camarote_barretao: boolean;
  treinamento_bombas: boolean;
}

export interface GameState {
  date: string; // YYYY-MM-DD
  counters: PrizeCounters;
  enabled: EnabledFlags;
}

function today(): string {
  return new Date().toISOString().slice(0, 10);
}

function ensureDataDir() {
  if (!fs.existsSync(DATA_DIR)) {
    fs.mkdirSync(DATA_DIR, { recursive: true });
  }
}

function defaultState(): GameState {
  return {
    date: today(),
    counters: {
      revestimento: 0,
      alinhamento: 0,
      convite_pista: 0,
      camarote_barretao: 0,
      treinamento_bombas: 0,
    },
    enabled: {
      camarote_barretao: false,
      treinamento_bombas: false,
    },
  };
}

export function readState(): GameState {
  ensureDataDir();
  if (!fs.existsSync(STATE_FILE)) {
    const s = defaultState();
    writeState(s);
    return s;
  }
  const raw = JSON.parse(fs.readFileSync(STATE_FILE, "utf-8")) as GameState;
  // Reset counters if day changed
  if (raw.date !== today()) {
    const reset: GameState = {
      date: today(),
      counters: {
        revestimento: 0,
        alinhamento: 0,
        convite_pista: 0,
        camarote_barretao: 0,
        treinamento_bombas: 0,
      },
      enabled: raw.enabled, // keep enabled flags across days
    };
    writeState(reset);
    return reset;
  }
  return raw;
}

export function writeState(state: GameState): void {
  ensureDataDir();
  fs.writeFileSync(STATE_FILE, JSON.stringify(state, null, 2), "utf-8");
}

export function appendParticipant(row: {
  nome: string;
  empresa: string;
  cargo: string;
  cidade?: string;
  estado?: string;
  telefone?: string;
  email?: string;
  prize: string;
  timestamp: string;
}): void {
  ensureDataDir();
  if (!fs.existsSync(PARTICIPANTS_FILE)) {
    fs.writeFileSync(
      PARTICIPANTS_FILE,
      "timestamp,nome,empresa,cargo,cidade,estado,telefone,email,prize\n",
      "utf-8"
    );
  }
  const q = (s?: string) => `"${(s ?? "").replace(/"/g, '""')}"`;
  const line = [
    row.timestamp,
    q(row.nome),
    q(row.empresa),
    q(row.cargo),
    q(row.cidade),
    q(row.estado),
    q(row.telefone),
    q(row.email),
    q(row.prize),
  ].join(",");
  fs.appendFileSync(PARTICIPANTS_FILE, line + "\n", "utf-8");
}

export function resetDailyCounters(): void {
  const state = readState();
  state.counters = {
    revestimento: 0,
    alinhamento: 0,
    convite_pista: 0,
    camarote_barretao: 0,
    treinamento_bombas: 0,
  };
  writeState(state);
}
