import { Router } from "express";
import { authMiddleware } from "../../common/middlewares/auth.middleware";
import { validate } from "../../common/middlewares/validate.middleware";
import { authLimiter } from "../../common/middlewares/rate-limit.middleware";
import { upload } from "../../common/middlewares/upload";
import {
  registerSchema,
  loginSchema,
  refreshSchema,
  logoutSchema,
  forgotPasswordSchema,
  verifyOtpSchema,
  resetPasswordSchema,
  changePasswordSchema,
  updateProfileSchema,
} from "./auth.validation";
import * as authController from "./auth.controller";
import "./auth.openapi";

const router = Router();

router.post(
  "/register",
  authLimiter,
  validate(registerSchema),
  authController.register
);
router.post("/login", authLimiter, validate(loginSchema), authController.login);
router.post(
  "/verify-otp",
  authLimiter,
  validate(verifyOtpSchema),
  authController.verifyOtp
);
router.post("/logout", validate(logoutSchema), authController.logout);
router.post("/refresh", validate(refreshSchema), authController.refresh);
router.get("/me", authMiddleware, authController.me);
router.patch("/profile", authMiddleware, validate(updateProfileSchema), authController.updateProfile);
router.post("/avatar", authMiddleware, upload.single("avatar"), authController.uploadAvatar);
router.delete("/avatar", authMiddleware, authController.removeAvatar);

// Password & OTP Routes
router.post(
  "/forgot-password",
  authLimiter,
  validate(forgotPasswordSchema),
  authController.forgotPassword
);
router.post(
  "/reset-password",
  authLimiter,
  validate(resetPasswordSchema),
  authController.resetPassword
);
router.post(
  "/change-password",
  authMiddleware,
  validate(changePasswordSchema),
  authController.changePassword
);

// Session Management Routes
router.get("/sessions", authMiddleware, authController.getSessions);
router.delete("/sessions/:id", authMiddleware, authController.revokeSession);
router.delete("/sessions", authMiddleware, authController.revokeAllSessions);

export default router;
