import * as express from 'express';
import { Response, Request } from 'express';
import { authentification } from '../../../middlewares/authentication.middleware';
import { authorization } from '../../../middlewares/authorization.middleware';
import { Roles } from '../../auth/enums/roles.enum';
import { AppointmentsController } from '../controllers/appointments.controller';

const Router = express.Router();
const staffRoles = [Roles.ADMIN, Roles.RECEPTIONIST];

Router.post('/', (req: Request, res: Response) => {
  AppointmentsController.create(req, res);
});

Router.post(
  '/admin',
  authentification,
  authorization(staffRoles),
  (req: Request, res: Response) => { void AppointmentsController.createAdmin(req, res); }
);

Router.get(
  '/',
  authentification,
  authorization(staffRoles),
  (req: Request, res: Response) => { void AppointmentsController.list(req, res); }
);

Router.get(
  '/:id',
  authentification,
  authorization(staffRoles),
  (req: Request, res: Response) => { void AppointmentsController.getOne(req, res); }
);

Router.patch(
  '/:id',
  authentification,
  authorization(staffRoles),
  (req: Request, res: Response) => { void AppointmentsController.update(req, res); }
);

Router.patch(
  '/:id/due',
  authentification,
  authorization(staffRoles),
  (req: Request, res: Response) => { void AppointmentsController.setAmountDue(req, res); }
);

Router.patch(
  '/:id/status',
  authentification,
  authorization(staffRoles),
  (req: Request, res: Response) => { void AppointmentsController.updateStatus(req, res); }
);

Router.post(
  '/:id/payment',
  authentification,
  authorization(staffRoles),
  (req: Request, res: Response) => { void AppointmentsController.recordPayment(req, res); }
);

Router.post(
  '/:id/refund',
  authentification,
  authorization(staffRoles),
  (req: Request, res: Response) => { void AppointmentsController.recordRefund(req, res); }
);

Router.post(
  '/:id/invoice',
  authentification,
  authorization(staffRoles),
  (req: Request, res: Response) => { void AppointmentsController.generateInvoice(req, res); }
);

Router.post(
  '/:id/receipt',
  authentification,
  authorization(staffRoles),
  (req: Request, res: Response) => { void AppointmentsController.generateReceipt(req, res); }
);

export default Router;
