import type { FastifyInstance } from 'fastify';
import {
  requestHandler, createDirectHandler, listAllHandler, listPendingHandler, listOpenHandler,
  getHandler, approveHandler, rejectHandler, revertHandler, updateHandler,
} from '../controllers/orderReturn.controller.js';
import { authorize, authorizeAny } from '../plugins/authorize.js';
import { PERMISSIONS } from '../constants/permissions.js';
import { requestReturnSchema, updateReturnSchema, rejectReturnSchema } from '../schemas/orderReturn.schema.js';

const CAN_EDIT_RETURN = [PERMISSIONS.ORDERS_RETURN_REQUEST, PERMISSIONS.ORDERS_RETURN_APPROVE];

export default async function orderReturnRoutes(fastify: FastifyInstance) {
  fastify.post(
    '/api/orders/returns',
    { preHandler: [authorize(PERMISSIONS.ORDERS_RETURN_REQUEST)], schema: requestReturnSchema },
    requestHandler,
  );
  // Admin-only direct create — auto-approved, no separate review step.
  fastify.post(
    '/api/orders/returns/direct',
    { preHandler: [authorize(PERMISSIONS.ORDERS_RETURN_APPROVE)], schema: requestReturnSchema },
    createDirectHandler,
  );
  fastify.get(
    '/api/orders/returns/pending',
    { preHandler: [authorize(PERMISSIONS.ORDERS_RETURN_APPROVE)] },
    listPendingHandler,
  );
  // Backs the dashboard "Returned Items" KPI modal — every open (pending or
  // active) return.
  fastify.get(
    '/api/orders/returns/open',
    { preHandler: [authorize(PERMISSIONS.ORDERS_RETURN_VIEW)] },
    listOpenHandler,
  );
  fastify.get(
    '/api/orders/returns',
    { preHandler: [authorize(PERMISSIONS.ORDERS_RETURN_VIEW)] },
    listAllHandler,
  );
  fastify.get(
    '/api/orders/returns/:id',
    { preHandler: [authorize(PERMISSIONS.ORDERS_RETURN_VIEW)] },
    getHandler,
  );
  fastify.post(
    '/api/orders/returns/:id/approve',
    { preHandler: [authorize(PERMISSIONS.ORDERS_RETURN_APPROVE)] },
    approveHandler,
  );
  fastify.post(
    '/api/orders/returns/:id/reject',
    { preHandler: [authorize(PERMISSIONS.ORDERS_RETURN_APPROVE)], schema: rejectReturnSchema },
    rejectHandler,
  );
  // Undoes an approved (status 'active') return, back to a normal delivered
  // line — separate permission from approve so the two can be granted
  // independently.
  fastify.post(
    '/api/orders/returns/:id/revert',
    { preHandler: [authorize(PERMISSIONS.ORDERS_RETURN_REVERT)] },
    revertHandler,
  );
  // Editing a still-pending request's own submitted details (not the order)
  // — the requester can edit their own, an approver can edit anyone's; the
  // service layer enforces the ownership check for a non-approver.
  fastify.put(
    '/api/orders/returns/:id',
    { preHandler: [authorizeAny(CAN_EDIT_RETURN)], schema: updateReturnSchema },
    updateHandler,
  );
}
