import { Router } from 'express';
import {
  register,
  login,
  adminLogin,
  sendVerificationOtp,
  verifyOtp,
  forgotPassword,
  resetPassword,
  googleLogin,
  refreshTokenHandler,
  getActiveSessions,
  logout,
  logoutAllDevices,
  updateProfile,
} from '../controllers/auth.controller';
import { authenticateJWT } from '../middleware/auth.middleware';
import { authRateLimiter, otpRateLimiter } from '../middleware/rateLimiter.middleware';
import { validateRequest } from '../middleware/validate.middleware';
import {
  registerSchema,
  loginSchema,
  adminLoginSchema,
  verifyOtpSchema,
  forgotPasswordSchema,
  resetPasswordSchema,
  googleAuthSchema,
  refreshTokenSchema,
  updateProfileSchema,
} from '../validators/auth.validator';

const router = Router();

// Public Authentication Endpoints
router.post('/register', authRateLimiter, validateRequest(registerSchema), register);
router.post('/login', authRateLimiter, validateRequest(loginSchema), login);
router.post('/admin/login', authRateLimiter, validateRequest(adminLoginSchema), adminLogin);
router.post('/google', authRateLimiter, validateRequest(googleAuthSchema), googleLogin);

// OTP & Verification Endpoints
router.post('/send-otp', otpRateLimiter, sendVerificationOtp);
router.post('/verify-otp', validateRequest(verifyOtpSchema), verifyOtp);

// Password Recovery Endpoints
router.post('/forgot-password', authRateLimiter, validateRequest(forgotPasswordSchema), forgotPassword);
router.post('/reset-password', authRateLimiter, validateRequest(resetPasswordSchema), resetPassword);

// Token Refresh
router.post('/refresh', validateRequest(refreshTokenSchema), refreshTokenHandler);

// Protected Session & Logout Endpoints
router.get('/sessions', authenticateJWT, getActiveSessions);
router.put('/profile', authenticateJWT, validateRequest(updateProfileSchema), updateProfile);
router.post('/logout', authenticateJWT, logout);
router.post('/logout-all', authenticateJWT, logoutAllDevices);

export default router;
