import { Router, Request, Response } from 'express';
import { authMiddleware } from '../middleware/auth';
import { findUserById, getPickBalance } from '../models/user';
import { getUserPicks, getPickCount } from '../models/pick';
import { getPurchasesByUser } from '../models/purchase';
import pool from '../db';

const router = Router();

// GET /api/user/dashboard
router.get('/dashboard', authMiddleware, async (req: Request, res: Response) => {
  try {
    const userId = req.user!.userId;
    const user = await findUserById(userId);
    if (!user) {
      res.status(404).json({ error: 'User not found' });
      return;
    }

    const balance = await getPickBalance(userId);
    const totalPicks = await getPickCount(userId);
    const recentPurchases = await getPurchasesByUser(userId, 10);

    res.json({
      email: user.email,
      is_weatherman: user.is_weatherman,
      email_verified: user.email_verified,
      balance,
      totalPicks,
      recentPurchases: recentPurchases.map((p) => ({
        id: p.id,
        productType: p.product_type,
        amount: `$${(p.amount_cents / 100).toFixed(2)}`,
        picksGranted: p.picks_granted,
        date: p.created_at,
      })),
      memberSince: user.created_at,
      preferences: user.preferences || {},
    });
  } catch (err) {
    console.error('Dashboard error:', err);
    res.status(500).json({ error: 'Failed to load dashboard' });
  }
});

// GET /api/user/picks
router.get('/picks', authMiddleware, async (req: Request, res: Response) => {
  try {
    const userId = req.user!.userId;
    const limit = Math.min(parseInt(req.query.limit as string) || 50, 200);

    const picks = await getUserPicks(userId, limit);

    res.json({
      picks: picks.map((p) => ({
        id: p.id,
        eventId: p.event_id,
        homeTeam: p.home_team,
        awayTeam: p.away_team,
        league: p.league,
        confidence: p.confidence_score,
        startsAt: p.starts_at,
        wasRainMan: p.was_weatherman,
        purchasedAt: p.created_at,
      })),
      total: picks.length,
    });
  } catch (err) {
    console.error('Forecasts error:', err);
    res.status(500).json({ error: 'Failed to load forecasts' });
  }
});

// GET /api/user/preferences — user profile tags
router.get('/preferences', authMiddleware, async (req: Request, res: Response) => {
  try {
    const userId = req.user!.userId;
    const { rows } = await pool.query(
      `SELECT preferences FROM rm_users WHERE id = $1`, [userId]
    );
    res.json({ preferences: rows[0]?.preferences || {} });
  } catch (err) {
    console.error('Preferences fetch error:', err);
    res.status(500).json({ error: 'Failed to fetch preferences' });
  }
});

// PUT /api/user/preferences — merge new profile tags
router.put('/preferences', authMiddleware, async (req: Request, res: Response) => {
  try {
    const userId = req.user!.userId;
    const updates = req.body;

    if (!updates || typeof updates !== 'object') {
      res.status(400).json({ error: 'JSON object required' });
      return;
    }

    // Only allow known profile keys
    const allowed = [
      'preferred_leagues', 'prefers_props', 'prefers_spreads', 'prefers_parlays',
      'bet_style', 'risk_tolerance', 'bankroll_band', 'sportsbook',
    ];
    const filtered: Record<string, any> = {};
    for (const key of allowed) {
      if (key in updates) filtered[key] = updates[key];
    }

    if (Object.keys(filtered).length === 0) {
      res.status(400).json({ error: 'No valid preference keys provided' });
      return;
    }

    const { rows } = await pool.query(
      `UPDATE rm_users
       SET preferences = COALESCE(preferences, '{}'::jsonb) || $1::jsonb
       WHERE id = $2
       RETURNING preferences`,
      [JSON.stringify(filtered), userId]
    );

    res.json({ ok: true, preferences: rows[0]?.preferences || {} });
  } catch (err) {
    console.error('Preferences update error:', err);
    res.status(500).json({ error: 'Failed to update preferences' });
  }
});

export default router;
