import { Router } from 'express';
import ausruestungsanfrageController from '../controllers/ausruestungsanfrage.controller';
import { authenticate } from '../middleware/auth.middleware';
import { requirePermission, requireAnyPermission } from '../middleware/rbac.middleware';

const router = Router();

// ---------------------------------------------------------------------------
// Categories (DB-backed CRUD)
// ---------------------------------------------------------------------------

router.get('/kategorien', authenticate, requireAnyPermission('ausruestungsanfrage:view', 'ausruestungsanfrage:create_request', 'ausruestungsanfrage:approve'), ausruestungsanfrageController.getKategorien.bind(ausruestungsanfrageController));
router.post('/kategorien', authenticate, requirePermission('ausruestungsanfrage:manage_categories'), ausruestungsanfrageController.createKategorie.bind(ausruestungsanfrageController));
router.patch('/kategorien/:id', authenticate, requirePermission('ausruestungsanfrage:manage_categories'), ausruestungsanfrageController.updateKategorie.bind(ausruestungsanfrageController));
router.delete('/kategorien/:id', authenticate, requirePermission('ausruestungsanfrage:manage_categories'), ausruestungsanfrageController.deleteKategorie.bind(ausruestungsanfrageController));

// ---------------------------------------------------------------------------
// Catalog Items
// ---------------------------------------------------------------------------

router.get('/items', authenticate, requireAnyPermission('ausruestungsanfrage:view', 'ausruestungsanfrage:create_request', 'ausruestungsanfrage:approve'), ausruestungsanfrageController.getItems.bind(ausruestungsanfrageController));
router.get('/items/:id', authenticate, requireAnyPermission('ausruestungsanfrage:view', 'ausruestungsanfrage:create_request', 'ausruestungsanfrage:approve'), ausruestungsanfrageController.getItemById.bind(ausruestungsanfrageController));
router.post('/items', authenticate, requirePermission('ausruestungsanfrage:manage_catalog'), ausruestungsanfrageController.createItem.bind(ausruestungsanfrageController));
router.patch('/items/:id', authenticate, requirePermission('ausruestungsanfrage:manage_catalog'), ausruestungsanfrageController.updateItem.bind(ausruestungsanfrageController));
router.delete('/items/:id', authenticate, requirePermission('ausruestungsanfrage:manage_catalog'), ausruestungsanfrageController.deleteItem.bind(ausruestungsanfrageController));

// Item characteristics (Eigenschaften)
router.get('/items/:id/eigenschaften', authenticate, requireAnyPermission('ausruestungsanfrage:view', 'ausruestungsanfrage:create_request', 'ausruestungsanfrage:approve'), ausruestungsanfrageController.getArtikelEigenschaften.bind(ausruestungsanfrageController));
router.post('/items/:id/eigenschaften', authenticate, requirePermission('ausruestungsanfrage:manage_catalog'), ausruestungsanfrageController.upsertArtikelEigenschaft.bind(ausruestungsanfrageController));
router.delete('/eigenschaften/:eigenschaftId', authenticate, requirePermission('ausruestungsanfrage:manage_catalog'), ausruestungsanfrageController.deleteArtikelEigenschaft.bind(ausruestungsanfrageController));

// Legacy text-based categories
router.get('/categories', authenticate, requirePermission('ausruestungsanfrage:view'), ausruestungsanfrageController.getCategories.bind(ausruestungsanfrageController));

// ---------------------------------------------------------------------------
// Users (for "order on behalf of" autocomplete)
// ---------------------------------------------------------------------------

router.get('/users', authenticate, requirePermission('ausruestungsanfrage:order_for_user'), ausruestungsanfrageController.getAllUsers.bind(ausruestungsanfrageController));

// ---------------------------------------------------------------------------
// Overview
// ---------------------------------------------------------------------------

router.get('/overview', authenticate, requirePermission('ausruestungsanfrage:approve'), ausruestungsanfrageController.getOverview.bind(ausruestungsanfrageController));
router.get('/widget-overview', authenticate, requirePermission('ausruestungsanfrage:widget'), ausruestungsanfrageController.getWidgetOverview.bind(ausruestungsanfrageController));

// ---------------------------------------------------------------------------
// Requests
// ---------------------------------------------------------------------------

router.get('/requests', authenticate, requirePermission('ausruestungsanfrage:approve'), ausruestungsanfrageController.getRequests.bind(ausruestungsanfrageController));
router.get('/requests/my', authenticate, ausruestungsanfrageController.getMyRequests.bind(ausruestungsanfrageController));
router.get('/requests/:id', authenticate, ausruestungsanfrageController.getRequestById.bind(ausruestungsanfrageController));
router.post('/requests', authenticate, requirePermission('ausruestungsanfrage:create_request'), ausruestungsanfrageController.createRequest.bind(ausruestungsanfrageController));
router.patch('/requests/:id', authenticate, ausruestungsanfrageController.updateRequest.bind(ausruestungsanfrageController));
router.patch('/requests/:id/status', authenticate, requirePermission('ausruestungsanfrage:approve'), ausruestungsanfrageController.updateRequestStatus.bind(ausruestungsanfrageController));
router.delete('/requests/:id', authenticate, requirePermission('ausruestungsanfrage:approve'), ausruestungsanfrageController.deleteRequest.bind(ausruestungsanfrageController));

// ---------------------------------------------------------------------------
// Unassigned positions
// ---------------------------------------------------------------------------

router.get('/nicht-zugewiesen', authenticate, requirePermission('ausruestungsanfrage:approve'), ausruestungsanfrageController.getUnassignedPositions.bind(ausruestungsanfrageController));

// ---------------------------------------------------------------------------
// Position delivery tracking
// ---------------------------------------------------------------------------

router.patch('/positionen/:positionId/artikel', authenticate, requirePermission('ausruestungsanfrage:approve'), ausruestungsanfrageController.updatePositionArtikelId.bind(ausruestungsanfrageController));
router.patch('/positionen/:positionId/geliefert', authenticate, requirePermission('ausruestungsanfrage:approve'), ausruestungsanfrageController.updatePositionGeliefert.bind(ausruestungsanfrageController));
router.patch('/positionen/:positionId/zurueckgegeben', authenticate, requirePermission('ausruestungsanfrage:approve'), ausruestungsanfrageController.updatePositionZurueckgegeben.bind(ausruestungsanfrageController));

// ---------------------------------------------------------------------------
// Linking requests to orders
// ---------------------------------------------------------------------------

router.post('/requests/:id/link', authenticate, requirePermission('ausruestungsanfrage:link_orders'), ausruestungsanfrageController.linkToOrder.bind(ausruestungsanfrageController));
router.delete('/requests/:id/link/:bestellungId', authenticate, requirePermission('ausruestungsanfrage:link_orders'), ausruestungsanfrageController.unlinkFromOrder.bind(ausruestungsanfrageController));
router.post('/requests/:id/create-orders', authenticate, requirePermission('ausruestungsanfrage:link_orders'), ausruestungsanfrageController.createOrders.bind(ausruestungsanfrageController));
router.post('/requests/:id/assign', authenticate, requirePermission('ausruestungsanfrage:approve'), ausruestungsanfrageController.assignDeliveredItems.bind(ausruestungsanfrageController));

export default router;
