import { Router } from 'express';
import { z } from 'zod';
import db from '../db/index.js';
import { HttpError } from '../middleware/errorHandler.js';

const router = Router();
// Monté sous requireAuth dans server.js

/* ─────────────────────────────────────────────────────────────
   GET /api/secteurs-inv
   Retourne les secteurs globaux (user_id IS NULL) + privés
   de l'utilisateur connecté.
───────────────────────────────────────────────────────────────*/
router.get('/', (req, res) => {
  const userId = req.user.id;
  const rows = db.prepare(`
    SELECT
      s.id,
      s.nom,
      CASE WHEN s.user_id IS NULL THEN 1 ELSE 0 END AS is_global,
      (SELECT COUNT(*) FROM plateforme_secteurs_inv ps WHERE ps.secteur_id = s.id
         AND ps.plateforme_id IN (
           SELECT p.id FROM plateformes p
           JOIN investisseurs i ON i.id = p.investisseur_id
           WHERE i.user_id = ?
         )
      ) AS nb_plateformes,
      (SELECT COUNT(*) FROM investissement_secteurs_inv is2 WHERE is2.secteur_id = s.id
         AND is2.investissement_id IN (
           SELECT inv.id FROM investissements inv
           JOIN investisseurs i ON i.id = inv.investisseur_id
           WHERE i.user_id = ?
         )
      ) AS nb_investissements
    FROM secteurs_inv s
    WHERE s.user_id IS NULL OR s.user_id = ?
    ORDER BY is_global DESC, s.nom
  `).all(userId, userId, userId);
  res.json(rows);
});

/* ─────────────────────────────────────────────────────────────
   POST /api/secteurs-inv — créer un secteur privé
───────────────────────────────────────────────────────────────*/
router.post('/', (req, res, next) => {
  try {
    const { nom } = z.object({ nom: z.string().min(1).max(200) }).parse(req.body);
    const userId = req.user.id;
    const dup = db.prepare(
      'SELECT id FROM secteurs_inv WHERE nom = ? AND (user_id IS NULL OR user_id = ?)'
    ).get(nom.trim(), userId);
    if (dup) throw new HttpError(409, `Le secteur "${nom.trim()}" existe déjà.`);
    const r = db.prepare(
      'INSERT INTO secteurs_inv (nom, user_id) VALUES (?, ?)'
    ).run(nom.trim(), userId);
    res.status(201).json({ id: r.lastInsertRowid, nom: nom.trim(), is_global: 0, nb_plateformes: 0, nb_investissements: 0 });
  } catch (e) { next(e); }
});

/* ─────────────────────────────────────────────────────────────
   PUT /api/secteurs-inv/:id — renommer (uniquement les privés)
───────────────────────────────────────────────────────────────*/
router.put('/:id', (req, res, next) => {
  try {
    const { nom } = z.object({ nom: z.string().min(1).max(200) }).parse(req.body);
    const userId = req.user.id;
    const row = db.prepare('SELECT id, nom, user_id FROM secteurs_inv WHERE id = ?').get(req.params.id);
    if (!row) throw new HttpError(404, 'Secteur introuvable');
    if (row.user_id === null) throw new HttpError(403, 'Les secteurs globaux ne peuvent pas être modifiés.');
    if (row.user_id !== userId) throw new HttpError(403, 'Ce secteur ne vous appartient pas.');
    const dup = db.prepare(
      'SELECT id FROM secteurs_inv WHERE nom = ? AND (user_id IS NULL OR user_id = ?) AND id != ?'
    ).get(nom.trim(), userId, row.id);
    if (dup) throw new HttpError(409, `Le secteur "${nom.trim()}" existe déjà.`);
    db.prepare('UPDATE secteurs_inv SET nom = ? WHERE id = ?').run(nom.trim(), row.id);
    res.json({ id: row.id, nom: nom.trim(), is_global: 0 });
  } catch (e) { next(e); }
});

/* ─────────────────────────────────────────────────────────────
   DELETE /api/secteurs-inv/:id — supprimer (uniquement les privés)
───────────────────────────────────────────────────────────────*/
router.delete('/:id', (req, res, next) => {
  try {
    const userId = req.user.id;
    const row = db.prepare('SELECT id, user_id FROM secteurs_inv WHERE id = ?').get(req.params.id);
    if (!row) throw new HttpError(404, 'Secteur introuvable');
    if (row.user_id === null) throw new HttpError(403, 'Les secteurs globaux ne peuvent pas être supprimés.');
    if (row.user_id !== userId) throw new HttpError(403, 'Ce secteur ne vous appartient pas.');

    db.transaction(() => {
      db.prepare('DELETE FROM plateforme_secteurs_inv WHERE secteur_id = ?').run(row.id);
      db.prepare('DELETE FROM investissement_secteurs_inv WHERE secteur_id = ?').run(row.id);
      db.prepare('DELETE FROM secteurs_inv WHERE id = ?').run(row.id);
    })();
    res.status(204).end();
  } catch (e) { next(e); }
});

export default router;
