import { Router } from 'express';
import bestellungController from '../controllers/bestellung.controller';
import { authenticate } from '../middleware/auth.middleware';
import { requirePermission, requireAnyPermission } from '../middleware/rbac.middleware';
import { uploadBestellung } from '../middleware/upload';

const router = Router();

// ---------------------------------------------------------------------------
// Vendors (Lieferanten)
// ---------------------------------------------------------------------------

router.get(
  '/vendors',
  authenticate,
  requirePermission('bestellungen:view'),
  bestellungController.listVendors.bind(bestellungController)
);

router.get(
  '/vendors/:id',
  authenticate,
  requirePermission('bestellungen:view'),
  bestellungController.getVendor.bind(bestellungController)
);

router.get(
  '/vendors/:id/orders',
  authenticate,
  requirePermission('bestellungen:view'),
  bestellungController.getVendorOrders.bind(bestellungController)
);

router.post(
  '/vendors',
  authenticate,
  requirePermission('bestellungen:manage_vendors'),
  bestellungController.createVendor.bind(bestellungController)
);

router.patch(
  '/vendors/:id',
  authenticate,
  requirePermission('bestellungen:manage_vendors'),
  bestellungController.updateVendor.bind(bestellungController)
);

router.delete(
  '/vendors/:id',
  authenticate,
  requirePermission('bestellungen:manage_vendors'),
  bestellungController.deleteVendor.bind(bestellungController)
);

// ---------------------------------------------------------------------------
// Catalog (shared ausruestung_artikel, accessed via bestellungen context)
// ---------------------------------------------------------------------------

router.get(
  '/katalog/items',
  authenticate,
  requirePermission('bestellungen:view'),
  bestellungController.listKatalogItems.bind(bestellungController)
);

router.get(
  '/katalog/items/:itemId',
  authenticate,
  requirePermission('bestellungen:view'),
  bestellungController.getKatalogItem.bind(bestellungController)
);

router.get(
  '/katalog/kategorien',
  authenticate,
  requirePermission('bestellungen:view'),
  bestellungController.listKatalogKategorien.bind(bestellungController)
);

// ---------------------------------------------------------------------------
// Members (all active users for member selector)
// ---------------------------------------------------------------------------

router.get(
  '/members',
  authenticate,
  requirePermission('bestellungen:view'),
  bestellungController.listMembers.bind(bestellungController)
);

// ---------------------------------------------------------------------------
// Orders (Bestellungen)
// ---------------------------------------------------------------------------

router.get(
  '/',
  authenticate,
  requirePermission('bestellungen:view'),
  bestellungController.listOrders.bind(bestellungController)
);

router.post(
  '/',
  authenticate,
  requirePermission('bestellungen:create'),
  bestellungController.createOrder.bind(bestellungController)
);

// Export must come before /:id to avoid param capture
router.get(
  '/export/:id',
  authenticate,
  requirePermission('bestellungen:export'),
  bestellungController.exportOrder.bind(bestellungController)
);

router.get(
  '/:id',
  authenticate,
  requirePermission('bestellungen:view'),
  bestellungController.getOrder.bind(bestellungController)
);

router.patch(
  '/:id',
  authenticate,
  requirePermission('bestellungen:create'),
  bestellungController.updateOrder.bind(bestellungController)
);

router.delete(
  '/:id',
  authenticate,
  requirePermission('bestellungen:delete'),
  bestellungController.deleteOrder.bind(bestellungController)
);

router.patch(
  '/:id/status',
  authenticate,
  requirePermission('bestellungen:create'),
  bestellungController.updateStatus.bind(bestellungController)
);

// ---------------------------------------------------------------------------
// Line Items (Bestellpositionen)
// ---------------------------------------------------------------------------

router.post(
  '/:id/items',
  authenticate,
  requirePermission('bestellungen:create'),
  bestellungController.addLineItem.bind(bestellungController)
);

router.patch(
  '/items/:itemId',
  authenticate,
  requirePermission('bestellungen:create'),
  bestellungController.updateLineItem.bind(bestellungController)
);

router.delete(
  '/items/:itemId',
  authenticate,
  requirePermission('bestellungen:delete'),
  bestellungController.deleteLineItem.bind(bestellungController)
);

router.patch(
  '/items/:itemId/received',
  authenticate,
  requireAnyPermission('bestellungen:manage_orders', 'bestellungen:create'),  bestellungController.updateReceivedQuantity.bind(bestellungController)
);

// ---------------------------------------------------------------------------
// Files (Bestellung Dateien)
// ---------------------------------------------------------------------------

router.post(
  '/:id/files',
  authenticate,
  requirePermission('bestellungen:create'),
  uploadBestellung.single('datei'),
  bestellungController.uploadFile.bind(bestellungController)
);

router.delete(
  '/files/:fileId',
  authenticate,
  requirePermission('bestellungen:delete'),
  bestellungController.deleteFile.bind(bestellungController)
);

router.get(
  '/:id/files',
  authenticate,
  requirePermission('bestellungen:view'),
  bestellungController.listFiles.bind(bestellungController)
);

// ---------------------------------------------------------------------------
// Reminders (Erinnerungen)
// ---------------------------------------------------------------------------

router.post(
  '/:id/reminders',
  authenticate,
  requirePermission('bestellungen:manage_reminders'),
  bestellungController.addReminder.bind(bestellungController)
);

router.patch(
  '/reminders/:remId',
  authenticate,
  requirePermission('bestellungen:manage_reminders'),
  bestellungController.markReminderDone.bind(bestellungController)
);

router.delete(
  '/reminders/:remId',
  authenticate,
  requirePermission('bestellungen:manage_reminders'),
  bestellungController.deleteReminder.bind(bestellungController)
);

// ---------------------------------------------------------------------------
// History & Export
// ---------------------------------------------------------------------------

router.get(
  '/:id/history',
  authenticate,
  requirePermission('bestellungen:view'),
  bestellungController.getHistory.bind(bestellungController)
);

export default router;
