import { Router } from 'express';
import { AppContainer } from '../container';
import { employeeAuth } from '../middleware/employeeAuth';
import { asyncHandler } from './http';

export function registerLeaveRoutes(router: Router, c: AppContainer): void {
  router.get(
    '/balances/me',
    employeeAuth,
    asyncHandler(async (req, res) => {
      res.json(await c.leaveFacade.getBalances(req.employeeId!));
    }),
  );

  router.get(
    '/leaves/pending-approval',
    employeeAuth,
    asyncHandler(async (req, res) => {
      res.json(await c.leaveFacade.listPendingApprovals(req.employeeId!));
    }),
  );

  router.get(
    '/leaves',
    employeeAuth,
    asyncHandler(async (req, res) => {
      res.json(await c.leaveFacade.listLeaves(req.employeeId!, req.query.status as string));
    }),
  );

  router.post(
    '/leaves',
    employeeAuth,
    asyncHandler(async (req, res) => {
      res.status(201).json(await c.leaveFacade.applyLeave(req.employeeId!, req.body));
    }),
  );

  router.get(
    '/leaves/:id',
    employeeAuth,
    asyncHandler(async (req, res) => {
      res.json(await c.leaveFacade.getLeave(req.params.id, req.employeeId!));
    }),
  );

  router.delete(
    '/leaves/:id',
    employeeAuth,
    asyncHandler(async (req, res) => {
      res.json(await c.leaveFacade.cancelLeave(req.params.id, req.employeeId!));
    }),
  );

  router.post(
    '/leaves/:id/approve',
    employeeAuth,
    asyncHandler(async (req, res) => {
      res.json(await c.leaveFacade.approveLeave(req.employeeId!, req.params.id, req.body.comment));
    }),
  );

  router.post(
    '/leaves/:id/reject',
    employeeAuth,
    asyncHandler(async (req, res) => {
      res.json(await c.leaveFacade.rejectLeave(req.employeeId!, req.params.id, req.body.comment));
    }),
  );
}
