import { Router } from 'express';
import { authenticate, requireAdmin, requireTeacherOrAdmin } from '../middlewares/auth';
import {
  getAllUsers,
  getUserById,
  createUser,
  updateUser,
  deleteUser,
  assignBotToStudent,
  assignTeachersToStudent,
  adminSetPassword,
  updateTeacherPermission,
} from '../controllers/userController';

const router = Router();

/**
 * @route   GET /api/users
 * @desc    Get all users with pagination and filtering (admin/teacher)
 * @access  Private (Admin/Teacher)
 */
router.get('/', authenticate, requireTeacherOrAdmin, getAllUsers);

/**
 * @route   POST /api/users
 * @desc    Create a new user
 * @access  Private (Admin)
 */
router.post('/', authenticate, requireAdmin, createUser);

/**
 * Specific :id routes (with extra path segment) - must be before generic /:id
 */
/**
 * @route   PATCH /api/users/:id/teacher-permission
 * @desc    Update teacher permissions (canCreateBots, canEditBots) - admin only
 * @access  Private (Admin)
 */
router.patch('/:id/teacher-permission', authenticate, requireAdmin, updateTeacherPermission);

/**
 * @route   PATCH /api/users/:id/assign-bot
 * @desc    Assign bot to student
 * @access  Private (Admin)
 */
router.patch('/:id/assign-bot', authenticate, requireAdmin, assignBotToStudent);

/**
 * @route   POST /api/users/:id/set-password
 * @desc    Admin sets a new password for a user
 * @access  Private (Admin)
 */
router.post('/:id/set-password', authenticate, requireAdmin, adminSetPassword);

/**
 * @route   PATCH /api/users/:id/assign-teacher
 * @desc    Assign teachers to student (admin) - supports multiple teachers
 * @access  Private (Admin)
 */
router.patch('/:id/assign-teacher', authenticate, requireAdmin, assignTeachersToStudent);

/**
 * @route   GET /api/users/:id
 * @desc    Get user by ID with bot accesses and recent conversations
 * @access  Private (Admin/Teacher)
 */
router.get('/:id', authenticate, requireTeacherOrAdmin, getUserById);

/**
 * @route   PUT /api/users/:id
 * @desc    Update user (name, email, role only - admin only)
 * @access  Private (Admin)
 */
router.put('/:id', authenticate, requireAdmin, updateUser);

/**
 * @route   DELETE /api/users/:id
 * @desc    Delete user (admin only)
 * @access  Private (Admin)
 */
router.delete('/:id', authenticate, requireAdmin, deleteUser);

export default router;

