/**
 * Push Notification Routes
 *
 * Subscribe, update preferences, unsubscribe.
 */

import { Router, Request, Response } from 'express';
import { authMiddleware } from '../middleware/auth';
import { getVapidPublicKey } from '../services/push';
import pool from '../db';

const router = Router();

// GET /api/push/vapid-key — public
router.get('/vapid-key', (_req: Request, res: Response) => {
  res.json({ publicKey: getVapidPublicKey() });
});

// POST /api/push/subscribe
router.post('/subscribe', authMiddleware, async (req: Request, res: Response) => {
  try {
    const userId = (req as any).user.userId;
    const { subscription, preferences } = req.body;

    if (!subscription?.endpoint || !subscription?.keys?.p256dh || !subscription?.keys?.auth) {
      res.status(400).json({ error: 'Invalid subscription object' });
      return;
    }

    const prefs = preferences || {
      high_confidence: true,
      props: true,
      line_moves: false,
      results: true,
      leagues: ['nba', 'nfl', 'nhl', 'mlb', 'ncaab', 'mma', 'epl'],
    };

    await pool.query(
      `INSERT INTO rm_push_subscriptions (user_id, endpoint, keys_p256dh, keys_auth, preferences)
       VALUES ($1, $2, $3, $4, $5)
       ON CONFLICT (user_id, endpoint) DO UPDATE SET
         keys_p256dh = EXCLUDED.keys_p256dh,
         keys_auth = EXCLUDED.keys_auth,
         preferences = EXCLUDED.preferences,
         is_active = TRUE`,
      [userId, subscription.endpoint, subscription.keys.p256dh, subscription.keys.auth, JSON.stringify(prefs)]
    );

    res.json({ ok: true });
  } catch (err) {
    console.error('Push subscribe error:', err);
    res.status(500).json({ error: 'Failed to subscribe' });
  }
});

// PUT /api/push/preferences
router.put('/preferences', authMiddleware, async (req: Request, res: Response) => {
  try {
    const userId = (req as any).user.userId;
    const { preferences } = req.body;

    if (!preferences) {
      res.status(400).json({ error: 'preferences required' });
      return;
    }

    await pool.query(
      `UPDATE rm_push_subscriptions SET preferences = $1 WHERE user_id = $2 AND is_active = TRUE`,
      [JSON.stringify(preferences), userId]
    );

    res.json({ ok: true });
  } catch (err) {
    console.error('Push preferences error:', err);
    res.status(500).json({ error: 'Failed to update preferences' });
  }
});

// POST /api/push/unsubscribe
router.post('/unsubscribe', authMiddleware, async (req: Request, res: Response) => {
  try {
    const userId = (req as any).user.userId;
    await pool.query(
      `UPDATE rm_push_subscriptions SET is_active = FALSE WHERE user_id = $1`,
      [userId]
    );
    res.json({ ok: true });
  } catch (err) {
    console.error('Push unsubscribe error:', err);
    res.status(500).json({ error: 'Failed to unsubscribe' });
  }
});

// GET /api/push/status — check if current user has active subscription
router.get('/status', authMiddleware, async (req: Request, res: Response) => {
  try {
    const userId = (req as any).user.userId;
    const { rows } = await pool.query(
      `SELECT id, preferences FROM rm_push_subscriptions WHERE user_id = $1 AND is_active = TRUE LIMIT 1`,
      [userId]
    );
    res.json({ subscribed: rows.length > 0, preferences: rows[0]?.preferences || null });
  } catch (err) {
    console.error('Push status error:', err);
    res.json({ subscribed: false, preferences: null });
  }
});

export default router;
