import { Router } from 'express';
import buchhaltungController from '../controllers/buchhaltung.controller';
import { authenticate } from '../middleware/auth.middleware';
import { requirePermission } from '../middleware/rbac.middleware';
import { uploadBuchhaltung } from '../middleware/upload';

const router = Router();

// ── Kategorien ────────────────────────────────────────────────────────────────
router.get('/kategorien',        authenticate, requirePermission('buchhaltung:view'),            buchhaltungController.listKategorien.bind(buchhaltungController));
router.post('/kategorien',       authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.createKategorie.bind(buchhaltungController));
router.patch('/kategorien/:id',  authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.updateKategorie.bind(buchhaltungController));
router.delete('/kategorien/:id', authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.deleteKategorie.bind(buchhaltungController));

// ── Stats ─────────────────────────────────────────────────────────────────────
router.get('/stats', authenticate, requirePermission('buchhaltung:view'), buchhaltungController.getStats.bind(buchhaltungController));
router.get('/stats/pending', authenticate, requirePermission('buchhaltung:view'), buchhaltungController.getPendingCount.bind(buchhaltungController));

// ── Haushaltsjahre ─────────────────────────────────────────────────────────────
router.get('/haushaltsjahre',          authenticate, requirePermission('buchhaltung:view'),            buchhaltungController.listHaushaltsjahre.bind(buchhaltungController));
router.post('/haushaltsjahre',         authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.createHaushaltsjahr.bind(buchhaltungController));
router.patch('/haushaltsjahre/:id',    authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.updateHaushaltsjahr.bind(buchhaltungController));
router.post('/haushaltsjahre/:id/close', authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.closeHaushaltsjahr.bind(buchhaltungController));

// ── Konto-Typen ───────────────────────────────────────────────────────────────
router.get('/konto-typen',        authenticate, requirePermission('buchhaltung:view'),            buchhaltungController.listKontoTypen.bind(buchhaltungController));
router.post('/konto-typen',       authenticate, requirePermission('buchhaltung:manage_settings'), buchhaltungController.createKontoTyp.bind(buchhaltungController));
router.patch('/konto-typen/:id',  authenticate, requirePermission('buchhaltung:manage_settings'), buchhaltungController.updateKontoTyp.bind(buchhaltungController));
router.delete('/konto-typen/:id', authenticate, requirePermission('buchhaltung:manage_settings'), buchhaltungController.deleteKontoTyp.bind(buchhaltungController));

// ── Bankkonten ────────────────────────────────────────────────────────────────
router.get('/bankkonten',       authenticate, requirePermission('buchhaltung:view'),            buchhaltungController.listBankkonten.bind(buchhaltungController));
router.post('/bankkonten',      authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.createBankkonto.bind(buchhaltungController));
router.patch('/bankkonten/:id', authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.updateBankkonto.bind(buchhaltungController));
router.delete('/bankkonten/:id',authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.deleteBankkonto.bind(buchhaltungController));
router.get('/bankkonten/:id/transaktionen', authenticate, requirePermission('buchhaltung:view'), buchhaltungController.getBankkontoStatement.bind(buchhaltungController));

// ── Konten ────────────────────────────────────────────────────────────────────
router.get('/konten/tree',        authenticate, requirePermission('buchhaltung:view'),            buchhaltungController.getKontenTree.bind(buchhaltungController));
router.get('/konten',             authenticate, requirePermission('buchhaltung:view'),            buchhaltungController.listKonten.bind(buchhaltungController));
router.post('/konten',            authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.createKonto.bind(buchhaltungController));
router.get('/konten/:id/detail',  authenticate, requirePermission('buchhaltung:view'),            buchhaltungController.getKontoDetail.bind(buchhaltungController));
router.patch('/konten/:id',       authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.updateKonto.bind(buchhaltungController));
router.delete('/konten/:id',      authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.deleteKonto.bind(buchhaltungController));
router.get('/konten/:id/budget',  authenticate, requirePermission('buchhaltung:view'),            buchhaltungController.getKontoBudget.bind(buchhaltungController));

// ── Belege (specific routes BEFORE /:id to prevent param capture) ─────────────
router.delete('/belege/:id', authenticate, requirePermission('buchhaltung:delete'), buchhaltungController.deleteBeleg.bind(buchhaltungController));

// ── Einstellungen ─────────────────────────────────────────────────────────────
router.get('/einstellungen', authenticate, requirePermission('buchhaltung:manage_settings'), buchhaltungController.getEinstellungen.bind(buchhaltungController));
router.put('/einstellungen', authenticate, requirePermission('buchhaltung:manage_settings'), buchhaltungController.setEinstellungen.bind(buchhaltungController));

// ── Wiederkehrend ─────────────────────────────────────────────────────────────
router.get('/wiederkehrend',        authenticate, requirePermission('buchhaltung:view'),            buchhaltungController.listWiederkehrend.bind(buchhaltungController));
router.post('/wiederkehrend',       authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.createWiederkehrend.bind(buchhaltungController));
router.patch('/wiederkehrend/:id',  authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.updateWiederkehrend.bind(buchhaltungController));
router.delete('/wiederkehrend/:id', authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.deleteWiederkehrend.bind(buchhaltungController));

// ── Erstattungen ──────────────────────────────────────────────────────────────
router.post('/erstattungen', authenticate, requirePermission('buchhaltung:create'), buchhaltungController.createErstattung.bind(buchhaltungController));
router.get('/transaktionen/:id/erstattung-links', authenticate, requirePermission('buchhaltung:view'), buchhaltungController.getErstattungLinks.bind(buchhaltungController));

// ── Planung ──────────────────────────────────────────────────────────────────
router.get('/planung',                           authenticate, requirePermission('buchhaltung:view'),            buchhaltungController.listPlanungen.bind(buchhaltungController));
router.post('/planung',                          authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.createPlanung.bind(buchhaltungController));
router.get('/planung/:id',                       authenticate, requirePermission('buchhaltung:view'),            buchhaltungController.getPlanung.bind(buchhaltungController));
router.put('/planung/:id',                       authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.updatePlanung.bind(buchhaltungController));
router.delete('/planung/:id',                    authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.deletePlanung.bind(buchhaltungController));
router.get('/planung/:id/positionen',            authenticate, requirePermission('buchhaltung:view'),            buchhaltungController.listPlanpositionen.bind(buchhaltungController));
router.post('/planung/:id/positionen',           authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.createPlanposition.bind(buchhaltungController));
router.put('/planung/positionen/:id',            authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.updatePlanposition.bind(buchhaltungController));
router.delete('/planung/positionen/:id',         authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.deletePlanposition.bind(buchhaltungController));
router.post('/planung/:id/create-haushaltsjahr', authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.createHaushaltsjahrFromPlan.bind(buchhaltungController));

// ── Audit ──────────────────────────────────────────────────────────────────────
router.get('/audit/:transaktionId', authenticate, requirePermission('buchhaltung:view'), buchhaltungController.getAudit.bind(buchhaltungController));

// ── CSV Export ─────────────────────────────────────────────────────────────────
router.get('/export/csv', authenticate, requirePermission('buchhaltung:export'), buchhaltungController.exportCsv.bind(buchhaltungController));

// ── Freigaben ─────────────────────────────────────────────────────────────────
router.patch('/freigaben/:id/genehmigen', authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.approveFreigabe.bind(buchhaltungController));
router.patch('/freigaben/:id/ablehnen',   authenticate, requirePermission('buchhaltung:manage_accounts'), buchhaltungController.rejectFreigabe.bind(buchhaltungController));

// ── Transfers ─────────────────────────────────────────────────────────────────
router.post('/transfers', authenticate, requirePermission('buchhaltung:create'), buchhaltungController.createTransfer.bind(buchhaltungController));

// ── Transaktionen (list/create — before /:id) ─────────────────────────────────
router.get('/',  authenticate, requirePermission('buchhaltung:view'),   buchhaltungController.listTransaktionen.bind(buchhaltungController));
router.post('/', authenticate, requirePermission('buchhaltung:create'), buchhaltungController.createTransaktion.bind(buchhaltungController));

// ── Transaktionen (detail — /:id must come last) ──────────────────────────────
router.get('/:id',        authenticate, requirePermission('buchhaltung:view'),   buchhaltungController.getTransaktion.bind(buchhaltungController));
router.patch('/:id',      authenticate, requirePermission('buchhaltung:edit'),   buchhaltungController.updateTransaktion.bind(buchhaltungController));
router.delete('/:id',     authenticate, requirePermission('buchhaltung:delete'), buchhaltungController.deleteTransaktion.bind(buchhaltungController));
router.post('/:id/buchen',  authenticate, requirePermission('buchhaltung:edit'), buchhaltungController.buchenTransaktion.bind(buchhaltungController));
router.post('/:id/storno',  authenticate, requirePermission('buchhaltung:edit'), buchhaltungController.stornoTransaktion.bind(buchhaltungController));
router.post('/:id/freigabe', authenticate, requirePermission('buchhaltung:edit'), buchhaltungController.requestFreigabe.bind(buchhaltungController));
router.post('/:id/belege',  authenticate, requirePermission('buchhaltung:create'), uploadBuchhaltung.single('datei'), buchhaltungController.uploadBeleg.bind(buchhaltungController));

export default router;
