import { Router } from "express";
import {
  getDashboard,
  getMe,
  getAllAdmins,
  deleteAdmin,
  updateMe,
  uploadAvatar,
  changePassword,
  getAllUsers,
  getAllUsersMinimal,
  getEmployeeDetails,
  getUser,
  createUser,
  updateUser,
  uploadUserAvatar,
  changeUserPassword,
  resendEmployeeInvite,
  deleteUser,
  getLeaderboard,
  getCertificateRequests,
  getCertificateRequestById,
  approveCertificateRequest,
  rejectCertificateRequest,
  get2FAStatusController,
  setup2FA,
  verify2FA,
  disable2FAController,
} from "../controllers/adminController";
import protectAdmin from "../middlewares/protectAdmin";
import uploadImage from "../middlewares/uploadImage";
import {
  addSudokuPuzzle,
  getAllSudokuPuzzles,
  getSudokuPuzzleById,
  deleteSudokuPuzzleById,
  updateSudokuPuzzle,
} from "../controllers/sudokuAdminController";
import {
  adminGetAllGames,
  adminAddGame,
  adminUpdateGame,
  adminDeleteGame,
} from "../controllers/availGamesController";
import { getAllSessions, getEmployeeSessions, deleteOldSessions } from '../controllers/employeeTracker';
import { uploadDesktopRelease, listDesktopReleases, removeDesktopRelease } from '../controllers/desktopReleaseController';
import { getEmployeeDesktopSync } from '../controllers/desktopSyncController';
import uploadInstaller from '../middlewares/uploadInstaller';


const router = Router();

// Dashboard
router.get("/dashboard", protectAdmin, getDashboard);

// Self
router.get("/me", protectAdmin, getMe);
router.get("/admins", protectAdmin, getAllAdmins);
router.delete("/admins/:id", protectAdmin, deleteAdmin);
router.put("/me", protectAdmin, updateMe);
router.put("/avatar", protectAdmin, uploadImage.single("avatar"), uploadAvatar);
router.put("/change-password", protectAdmin, changePassword);

// Leaderboard
router.get("/leaderboard", protectAdmin, getLeaderboard);

// User management
router.get("/users/all", protectAdmin, getAllUsersMinimal);
router.get("/users/details/:employeeId", protectAdmin, getEmployeeDetails);
router.get("/users", protectAdmin, getAllUsers);
router.post("/users", protectAdmin, createUser);
router.get("/users/:id", protectAdmin, getUser);
router.put("/users/:id", protectAdmin, updateUser);
router.put("/users/:id/avatar", protectAdmin, uploadImage.single("avatar"), uploadUserAvatar);
router.put("/users/:id/change-password", protectAdmin, changeUserPassword);
router.post("/users/:id/resend-invite", protectAdmin, resendEmployeeInvite);
router.delete("/users/:id", protectAdmin, deleteUser);

// Certificate requests
router.get("/certificate-requests", protectAdmin, getCertificateRequests);
router.get(
  "/certificate-requests/:id",
  protectAdmin,
  getCertificateRequestById,
);
router.patch(
  "/certificate-requests/:id/approve",
  protectAdmin,
  approveCertificateRequest,
);
router.patch(
  "/certificate-requests/:id/reject",
  protectAdmin,
  rejectCertificateRequest,
);

//Admin routes for managing sudoku puzzles
// Get all sudoku puzzles (admin only)
router.get("/sudoku", protectAdmin, getAllSudokuPuzzles);
// Get a single sudoku puzzle by id (admin only)
router.get("/sudoku/:id", protectAdmin, getSudokuPuzzleById);
// Delete a sudoku puzzle by id (admin only)
router.delete("/sudoku/:id", protectAdmin, deleteSudokuPuzzleById);
// Add a new sudoku puzzle (admin only)
router.post("/sudoku", protectAdmin, addSudokuPuzzle);
// Update a sudoku puzzle by id (admin only)
router.put("/sudoku/:id", protectAdmin, updateSudokuPuzzle);

// Admin routes for managing games
router.get("/games/all", protectAdmin, adminGetAllGames);
router.post("/games/add", protectAdmin, adminAddGame);
router.put("/games/update/:id", protectAdmin, adminUpdateGame);
router.delete("/games/delete/:id", protectAdmin, adminDeleteGame);

//__________________________2FA routes__________________________
router.get("/2fa/status", protectAdmin, get2FAStatusController);
router.post("/2fa/setup", protectAdmin, setup2FA);
router.post("/2fa/verify", protectAdmin, verify2FA);
router.post("/2fa/disable", protectAdmin, disable2FAController);

//___________________________Desktop Session routes__________________________
router.get('/desktop/sessions', protectAdmin, getAllSessions);
router.get('/desktop/session/:employee_id', protectAdmin, getEmployeeSessions);
router.delete('/desktop/sessions', protectAdmin, deleteOldSessions);
router.get('/desktop/sync/:employee_id', protectAdmin, getEmployeeDesktopSync);

//___________________________Desktop Release Management__________________________
router.get('/desktop-release', protectAdmin, listDesktopReleases);
router.post('/desktop-release', protectAdmin, uploadInstaller.single('installer'), uploadDesktopRelease);
router.delete('/desktop-release/:id', protectAdmin, removeDesktopRelease);

export default router;
