import {
  getZiplineLevels,
  startZiplineAttempt,
  updateZiplineAttempt,
  submitZiplineAttempt,
  getMyZiplineAttempts,
  addZiplinePuzzle,
  updateZiplinePuzzle,
  deleteZiplinePuzzle,
} from "../controllers/ziplineControllers";
import protectAdmin from "../middlewares/protectAdmin";
import { Router } from "express";
import {
  getSudokuPuzzle,
  startSudokuAttempt,
  updateSudokuAttempt,
  submitSudokuAttempt,
  getMySudokuAttempts,
} from "../controllers/sudokuController";
import protectUser from "../middlewares/protectUser";
import {
  getWheelController,
  getWheelEligibilityController,
  spinWheelController,
  getSpinHistoryController,
  createWheelController,
  listWheelsController,
  updateWheelController,
  deleteWheelController,
} from "../controllers/spinWheelController";

const router = Router();

// ─── SUDOKU GAME ROUTES ───────────────────────────────
// Get a random sudoku puzzle
router.get("/sudoku", protectUser, getSudokuPuzzle);
// Start a new sudoku attempt
router.post("/sudoku/start", protectUser, startSudokuAttempt);
// Update progress for an attempt
router.patch("/sudoku/attempt/:attemptId", protectUser, updateSudokuAttempt);
// Submit a sudoku attempt
router.post(
  "/sudoku/attempt/:attemptId/submit",
  protectUser,
  submitSudokuAttempt,
);

// Get user's past sudoku attempts
router.get("/sudoku/my-attempts", protectUser, getMySudokuAttempts);

// ─── ZIPLINE GAME ROUTES ───────────────────────────────
// Start a new zipline attempt
router.post("/zipline/start", protectUser, startZiplineAttempt);
// Update progress for a zipline attempt
router.patch("/zipline/attempt/:attemptId", protectUser, updateZiplineAttempt);
// Submit a zipline attempt
router.post(
  "/zipline/attempt/:attemptId/submit",
  protectUser,
  submitZiplineAttempt,
);
// Get user's past zipline attempts
router.get("/zipline/my-attempts", protectUser, getMyZiplineAttempts);

// ADMIN:Get all zipline puzzles (levels)
router.get("/zipline", protectAdmin, getZiplineLevels);
// ADMIN: Add a new zipline puzzle
router.post("/zipline", protectAdmin, addZiplinePuzzle);
// ADMIN: Update a zipline puzzle
router.put("/zipline/:puzzleId", protectAdmin, updateZiplinePuzzle);
// ADMIN: Delete a zipline puzzle
router.delete("/zipline/:puzzleId", protectAdmin, deleteZiplinePuzzle);

// ─── SPIN WHEEL ROUTES ───────────────────────────────────────────────────
router.post("/spin", protectAdmin, createWheelController);
router.get("/spin/wheels", protectAdmin, listWheelsController);
router.put("/spin/wheels/:wheelId", protectAdmin, updateWheelController);
router.delete("/spin/wheels/:wheelId", protectAdmin, deleteWheelController);
router.get("/spin", protectUser, getWheelController);
router.get("/spin/eligibility", protectUser, getWheelEligibilityController);
router.post("/spin/spin-wheel", protectUser, spinWheelController);
router.get("/spin/history", protectUser, getSpinHistoryController);

export default router;
