import { Router } from 'express';

import { createAccessRouter } from '../modules/access/access.routes';
import { createAuthRouter } from '../modules/auth/auth.routes';
import { createGovernanceRouter } from '../modules/governance/governance.routes';
import { createIdentityRouter } from '../modules/identity/identity.routes';
import { createMfaRouter } from '../modules/mfa/mfa.routes';
import { createOidcRouter } from '../modules/oidc/oidc.routes';
import { createRbacRouter } from '../modules/rbac/rbac.routes';
import { createSessionRouter } from '../modules/session/session.routes';

/**
 * EN: Create and configure main application router
 * VI: Tạo và cấu hình router chính cho ứng dụng
 */
export const createRouter = (): Router => {
  const router = Router();

  // EN: Health Check (root level, no API prefix needed)
  // VI: Kiểm tra trạng thái (ở root level, không cần prefix API)
  router.get('/health', (req, res) => {
    res.json({ status: 'ok', timestamp: new Date().toISOString() });
  });

  // EN: API v1 routes with prefix
  // VI: Routes API v1 với prefix
  const apiV1Router = Router();

  // EN: Auth Routes
  // VI: Routes xác thực
  apiV1Router.use('/auth', createAuthRouter());

  // EN: Session Routes
  // VI: Routes phiên làm việc
  apiV1Router.use('/sessions', createSessionRouter());

  // EN: OIDC Routes
  // VI: Routes OpenID Connect
  apiV1Router.use('/oidc', createOidcRouter());

  // EN: RBAC Routes
  // VI: Routes phân quyền
  apiV1Router.use('/rbac', createRbacRouter());

  // EN: MFA Routes
  // VI: Routes xác thực đa yếu tố
  apiV1Router.use('/mfa', createMfaRouter());

  // EN: Identity Routes
  // VI: Routes định danh
  apiV1Router.use('/identity', createIdentityRouter());

  // EN: Access Routes
  // VI: Routes truy cập
  apiV1Router.use('/access', createAccessRouter());

  // EN: Governance Routes
  // VI: Routes quản trị
  apiV1Router.use('/governance', createGovernanceRouter());

  // EN: Mount API v1 router with prefix
  // VI: Mount router API v1 với prefix
  router.use('/api/v1', apiV1Router);

  return router;
};
