import { Router } from 'express';
import { requireAdmin } from '../middleware/auth.js';
import db from '../db/index.js';

const router = Router();

/* ── GET /api/taux-credit-impot — liste complète (auth requis, pas admin) ── */
router.get('/', (req, res) => {
  const rows = db.prepare(
    'SELECT * FROM taux_credit_impot ORDER BY nom_pays ASC'
  ).all();
  res.json(rows);
});

/* ── GET /api/taux-credit-impot/:code — par code pays (pour jointure plateforme) ── */
router.get('/pays/:code', (req, res) => {
  const row = db.prepare(
    'SELECT * FROM taux_credit_impot WHERE UPPER(code_pays) = UPPER(?)'
  ).get(req.params.code);
  if (!row) return res.status(404).json({ error: 'Pays introuvable' });
  res.json(row);
});

/* ── POST /api/taux-credit-impot — créer (admin) ── */
router.post('/', requireAdmin, (req, res) => {
  const {
    nom_pays, code_pays,
    div_taux, div_taux_alt, div_taux_alt_label, div_exclusif_residence,
    int_taux, int_taux_alt, int_taux_alt_label, int_exclusif_residence,
    notice, statut_convention, date_suspension, ref_boi,
  } = req.body;

  if (!nom_pays?.trim()) {
    return res.status(400).json({ error: 'Le nom du pays est requis.' });
  }

  try {
    const result = db.prepare(`
      INSERT INTO taux_credit_impot
        (nom_pays, code_pays,
         div_taux, div_taux_alt, div_taux_alt_label, div_exclusif_residence,
         int_taux, int_taux_alt, int_taux_alt_label, int_exclusif_residence,
         statut_convention, date_suspension, ref_boi, notice)
      VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)
    `).run(
      nom_pays.trim(),
      code_pays?.trim()?.toUpperCase() || null,
      div_taux != null ? Number(div_taux) : null,
      div_taux_alt != null ? Number(div_taux_alt) : null,
      div_taux_alt_label?.trim() || null,
      div_exclusif_residence ? 1 : 0,
      int_taux != null ? Number(int_taux) : null,
      int_taux_alt != null ? Number(int_taux_alt) : null,
      int_taux_alt_label?.trim() || null,
      int_exclusif_residence ? 1 : 0,
      statut_convention || 'active',
      date_suspension || null,
      ref_boi?.trim() || null,
      notice?.trim() || null,
    );
    const row = db.prepare('SELECT * FROM taux_credit_impot WHERE id = ?').get(result.lastInsertRowid);
    res.status(201).json(row);
  } catch (e) {
    if (e.message?.includes('UNIQUE')) {
      return res.status(409).json({ error: 'Ce pays existe déjà.' });
    }
    throw e;
  }
});

/* ── PUT /api/taux-credit-impot/:id — modifier (admin) ── */
router.put('/:id', requireAdmin, (req, res) => {
  const {
    nom_pays, code_pays,
    div_taux, div_taux_alt, div_taux_alt_label, div_exclusif_residence,
    int_taux, int_taux_alt, int_taux_alt_label, int_exclusif_residence,
    notice, statut_convention, date_suspension, ref_boi,
  } = req.body;

  if (!nom_pays?.trim()) {
    return res.status(400).json({ error: 'Le nom du pays est requis.' });
  }

  const existing = db.prepare('SELECT id FROM taux_credit_impot WHERE id = ?').get(Number(req.params.id));
  if (!existing) return res.status(404).json({ error: 'Introuvable' });

  db.prepare(`
    UPDATE taux_credit_impot SET
      nom_pays = ?, code_pays = ?,
      div_taux = ?, div_taux_alt = ?, div_taux_alt_label = ?, div_exclusif_residence = ?,
      int_taux = ?, int_taux_alt = ?, int_taux_alt_label = ?, int_exclusif_residence = ?,
      notice = ?, statut_convention = ?, date_suspension = ?, ref_boi = ?,
      updated_at = datetime('now')
    WHERE id = ?
  `).run(
    nom_pays.trim(),
    code_pays?.trim()?.toUpperCase() || null,
    div_taux != null && div_taux !== '' ? Number(div_taux) : null,
    div_taux_alt != null && div_taux_alt !== '' ? Number(div_taux_alt) : null,
    div_taux_alt_label?.trim() || null,
    div_exclusif_residence ? 1 : 0,
    int_taux != null && int_taux !== '' ? Number(int_taux) : null,
    int_taux_alt != null && int_taux_alt !== '' ? Number(int_taux_alt) : null,
    int_taux_alt_label?.trim() || null,
    int_exclusif_residence ? 1 : 0,
    notice?.trim() || null,
    statut_convention || 'active',
    date_suspension || null,
    ref_boi?.trim() || null,
    Number(req.params.id),
  );

  const row = db.prepare('SELECT * FROM taux_credit_impot WHERE id = ?').get(Number(req.params.id));
  res.json(row);
});

/* ── DELETE /api/taux-credit-impot/:id — supprimer (admin) ── */
router.delete('/:id', requireAdmin, (req, res) => {
  const existing = db.prepare('SELECT id FROM taux_credit_impot WHERE id = ?').get(Number(req.params.id));
  if (!existing) return res.status(404).json({ error: 'Introuvable' });
  db.prepare('DELETE FROM taux_credit_impot WHERE id = ?').run(Number(req.params.id));
  res.status(204).end();
});

export default router;
