import { Router } from "express";
import {
  readState,
  writeState,
  appendParticipant,
  resetDailyCounters,
} from "../lib/gameState";

const router = Router();

// ─── Prize definitions ────────────────────────────────────────────────────────

type PrizeName =
  | "Chopp"
  | "Boné UMR"
  | "Necessaire"
  | "Revestimento"
  | "Alinhamento de Bomba"
  | "Convite Pista Barretão"
  | "Camarote Barretão"
  | "Treinamento de Bombas";

type Cargo =
  | "Gerente de Manutenção"
  | "Coordenador de Manutenção"
  | "Supervisor de Manutenção"
  | "Engenharia de Projetos"
  | "Engenharia de Manutenção"
  | "Engenharia Química"
  | "Mecânico"
  | "Comprador"
  | "PCM – Planejamento e Controle da Manutenção"
  | "Fornecedor"
  | "Outros";

// Display name → SVG asset key
const PRIZE_KEY: Record<string, string> = {
  "Chopp": "popup_chopp",
  "Boné UMR": "popup_bone",
  "Necessaire": "popup_necessaire",
  "Revestimento": "popup_revestimento",
  "Alinhamento de Bomba": "popup_alinhamento",
  "Convite Pista Barretão": "popup_convite_pista",
  "Camarote Barretão": "popup_camarote_barretao",
  "Treinamento de Bombas": "popup_treinamento_bombas",
};

// Cargos that each special prize BLOCKS
const BLOCKED_BY_CARGO: Record<string, Cargo[]> = {
  Revestimento: [
    "Comprador", "Fornecedor", "Outros",
    "Engenharia de Manutenção", "Engenharia de Projetos", "Engenharia Química",
  ],
  "Alinhamento de Bomba": [
    "Comprador", "Fornecedor", "Outros",
    "Engenharia de Manutenção", "Engenharia de Projetos", "Engenharia Química",
  ],
  "Convite Pista Barretão": ["Outros", "Fornecedor"],
  "Camarote Barretão": ["Mecânico", "Fornecedor", "Outros"],
  "Treinamento de Bombas": ["Comprador", "Fornecedor", "Outros"],
};

// Counter keys for special prizes
const COUNTER_KEY: Record<string, keyof ReturnType<typeof readState>["counters"]> = {
  Revestimento: "revestimento",
  "Alinhamento de Bomba": "alinhamento",
  "Convite Pista Barretão": "convite_pista",
  "Camarote Barretão": "camarote_barretao",
  "Treinamento de Bombas": "treinamento_bombas",
};

// Enable-flag keys for manual-enable prizes (keyed by snake_case API key AND display name)
const ENABLED_KEY: Partial<Record<string, keyof ReturnType<typeof readState>["enabled"]>> = {
  "Camarote Barretão": "camarote_barretao",
  "Treinamento de Bombas": "treinamento_bombas",
  "camarote_barretao": "camarote_barretao",
  "treinamento_bombas": "treinamento_bombas",
};

// Base pool (weighted): 60% Chopp, 20% Boné, 20% Necessaire
const BASE_POOL: PrizeName[] = [
  ...Array(60).fill("Chopp"),
  ...Array(20).fill("Boné UMR"),
  ...Array(20).fill("Necessaire"),
];

const SPECIAL_PRIZES: PrizeName[] = [
  "Revestimento",
  "Alinhamento de Bomba",
  "Convite Pista Barretão",
  "Camarote Barretão",
  "Treinamento de Bombas",
];

function drawPrize(cargo: Cargo): PrizeName {
  const state = readState();

  // Build eligible special prizes for this cargo
  const eligibleSpecials = SPECIAL_PRIZES.filter((prize) => {
    // Check cargo restriction
    const blocked = BLOCKED_BY_CARGO[prize] ?? [];
    if (blocked.includes(cargo)) return false;

    // Check daily limit (1/day)
    const counterKey = COUNTER_KEY[prize];
    if (state.counters[counterKey] >= 1) return false;

    // Check manual enable flag
    const enabledKey = ENABLED_KEY[prize];
    if (enabledKey !== undefined && !state.enabled[enabledKey]) return false;

    return true;
  });

  // Build combined pool: base + eligible specials (each special has same weight as 1 base slot)
  const pool: PrizeName[] = [...BASE_POOL, ...eligibleSpecials];

  const drawn = pool[Math.floor(Math.random() * pool.length)] as PrizeName;

  // Increment counter if special
  if (SPECIAL_PRIZES.includes(drawn)) {
    const counterKey = COUNTER_KEY[drawn];
    state.counters[counterKey] += 1;
    writeState(state);
  }

  return drawn;
}

// ─── POST /api/participants ────────────────────────────────────────────────────

router.post("/participants", (req, res) => {
  const { nome, empresa, cargo, cidade, estado, telefone, email } = req.body as {
    nome?: string;
    empresa?: string;
    cargo?: string;
    cidade?: string;
    estado?: string;
    telefone?: string;
    email?: string;
  };

  if (!nome || !empresa || !cargo) {
    res.status(400).json({ error: "nome, empresa e cargo são obrigatórios" });
    return;
  }

  const prize = drawPrize(cargo as Cargo);
  const prizeKey = PRIZE_KEY[prize] ?? "popup_chopp";
  const timestamp = new Date().toISOString();

  appendParticipant({ nome, empresa, cargo, cidade, estado, telefone, email, prize, timestamp });

  res.json({ prize, prizeKey, timestamp });
});

// ─── GET /api/admin/status ─────────────────────────────────────────────────────

router.get("/admin/status", (_req, res) => {
  const state = readState();
  res.json({
    date: state.date,
    counters: state.counters,
    enabled: state.enabled,
  });
});

// ─── POST /api/admin/reset ─────────────────────────────────────────────────────

router.post("/admin/reset", (_req, res) => {
  resetDailyCounters();
  const state = readState();
  res.json({ date: state.date, counters: state.counters, enabled: state.enabled });
});

// ─── POST /api/admin/toggle-prize ─────────────────────────────────────────────

router.post("/admin/toggle-prize", (req, res) => {
  const { prize, enabled } = req.body as {
    prize?: string;
    enabled?: boolean;
  };

  if (!prize || typeof enabled !== "boolean") {
    res.status(400).json({ error: "prize e enabled são obrigatórios" });
    return;
  }

  const enabledKey = ENABLED_KEY[prize];
  if (!enabledKey) {
    res.status(400).json({ error: `Prêmio "${prize}" não tem flag de habilitação` });
    return;
  }

  const state = readState();
  state.enabled[enabledKey] = enabled;
  writeState(state);

  res.json({ date: state.date, counters: state.counters, enabled: state.enabled });
});

export default router;
