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

const router = Router();
router.use(requireAuth);

// ── POST /api/notifications/seed (admin only) ─────────────────────────────────
const SEED_NOTIFS = [
  { type: 'system',       title: 'Mise à jour système',               body: "Une nouvelle version de l'application est disponible." },
  { type: 'info',         title: 'Conseil du jour',                   body: 'Diversifiez vos plateformes pour réduire le risque.' },
  { type: 'success',      title: 'Investissement remboursé',          body: 'Le prêt #1042 a été remboursé intégralement.' },
  { type: 'warning',      title: 'Retard de paiement détecté',        body: 'La plateforme Lendosphere signale un retard sur le prêt #0987.' },
  { type: 'ticket_reply', title: 'Réponse à votre ticket',            body: "Votre demande #42 a reçu une réponse de l'équipe support." },
  { type: 'team',         title: 'Nouvel investisseur',               body: 'Un nouveau profil investisseur a été ajouté à votre espace.' },
  { type: 'security',     title: 'Connexion depuis un nouvel appareil', body: "Une connexion a été détectée depuis un navigateur inconnu. Si ce n'est pas vous, changez votre mot de passe." },
  { type: 'announcement', title: 'Nouvelle fonctionnalité disponible', body: 'La page Fiscalité a été enrichie avec le simulateur CERFA 2561. Découvrez les nouveautés.' },
];

router.post('/seed', requireAdmin, (req, res) => {
  const userId = req.user.id;
  const { count = 3 } = req.body ?? {};
  const n = Math.min(Math.max(1, Number(count)), SEED_NOTIFS.length);
  const shuffled = [...SEED_NOTIFS].sort(() => Math.random() - .5).slice(0, n);
  const insert = db.prepare(
    'INSERT INTO notifications (user_id, type, title, body) VALUES (?, ?, ?, ?)'
  );
  const insertMany = db.transaction((items) => {
    for (const item of items) insert.run(userId, item.type, item.title, item.body);
  });
  insertMany(shuffled);
  res.json({ ok: true, created: n });
});

// ── POST /api/notifications/broadcast (admin only) ────────────────────────────
// Envoyer une notification manuelle à tous les users ou un user spécifique
router.post('/broadcast', requireAdmin, (req, res) => {
  const { type = 'announcement', title, body, link, user_id } = req.body ?? {};
  if (!title?.trim()) return res.status(400).json({ error: 'Titre requis' });

  const VALID_TYPES = ['system','ticket_reply','info','team','success','warning','security','announcement'];
  if (!VALID_TYPES.includes(type)) return res.status(400).json({ error: 'Type invalide' });

  const insert = db.prepare(
    'INSERT INTO notifications (user_id, type, title, body, link) VALUES (?, ?, ?, ?, ?)'
  );

  let targets;
  if (user_id === 'admins') {
    targets = db.prepare("SELECT id FROM users WHERE role = 'admin'").all();
  } else if (user_id) {
    const u = db.prepare('SELECT id FROM users WHERE id = ?').get(user_id);
    if (!u) return res.status(404).json({ error: 'Utilisateur introuvable' });
    targets = [u];
  } else {
    targets = db.prepare('SELECT id FROM users').all();
  }

  const tx = db.transaction((users) => {
    for (const u of users) insert.run(u.id, type, title.trim(), body?.trim() ?? null, link ?? null);
  });
  tx(targets);

  res.json({ ok: true, sent: targets.length });
});

// ── GET /api/notifications ───────────────────────────────────────────────────
// Query params: ?unread_only=true&limit=50&offset=0&type=system
router.get('/', (req, res) => {
  const userId = req.user.id;
  const { unread_only, type, limit = 50, offset = 0 } = req.query;

  let where = 'WHERE n.user_id = ?';
  const params = [userId];

  if (unread_only === 'true') {
    where += ' AND n.read = 0';
  }
  if (type) {
    where += ' AND n.type = ?';
    params.push(type);
  }

  const rows = db.prepare(`
    SELECT * FROM notifications n
    ${where}
    ORDER BY n.created_at DESC
    LIMIT ? OFFSET ?
  `).all(...params, Number(limit), Number(offset));

  const total = db.prepare(`
    SELECT COUNT(*) as cnt FROM notifications n ${where}
  `).get(...params).cnt;

  res.json({ notifications: rows, total });
});

// ── GET /api/notifications/count ─────────────────────────────────────────────
router.get('/count', (req, res) => {
  const { count } = db.prepare(
    'SELECT COUNT(*) as count FROM notifications WHERE user_id = ? AND read = 0'
  ).get(req.user.id);
  res.json({ unread: count });
});

// ── PATCH /api/notifications/read-all ────────────────────────────────────────
router.patch('/read-all', (req, res) => {
  db.prepare('UPDATE notifications SET read = 1 WHERE user_id = ? AND read = 0')
    .run(req.user.id);
  res.json({ ok: true });
});

// ── PATCH /api/notifications/:id/read ────────────────────────────────────────
router.patch('/:id/read', (req, res) => {
  const notif = db.prepare('SELECT id FROM notifications WHERE id = ? AND user_id = ?')
    .get(req.params.id, req.user.id);
  if (!notif) return res.status(404).json({ error: 'Notification introuvable' });

  db.prepare('UPDATE notifications SET read = 1 WHERE id = ?').run(req.params.id);
  res.json({ ok: true });
});

// ── DELETE /api/notifications/:id ────────────────────────────────────────────
router.delete('/:id', (req, res) => {
  const notif = db.prepare('SELECT id FROM notifications WHERE id = ? AND user_id = ?')
    .get(req.params.id, req.user.id);
  if (!notif) return res.status(404).json({ error: 'Notification introuvable' });

  db.prepare('DELETE FROM notifications WHERE id = ?').run(req.params.id);
  res.json({ ok: true });
});

// ── DELETE /api/notifications (tout supprimer) ────────────────────────────────
router.delete('/', (req, res) => {
  db.prepare('DELETE FROM notifications WHERE user_id = ?').run(req.user.id);
  res.json({ ok: true });
});

export default router;
