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

const router = Router();

const CLIPPED_ENABLED = () => process.env.FEATURE_CLIPPED_ENABLED === 'true';

// POST /api/clipped/:assetId — clip a forecast asset
router.post('/:assetId', authMiddleware, async (req: Request, res: Response) => {
  try {
    if (!CLIPPED_ENABLED()) {
      res.status(400).json({ error: 'Clipped feature is not currently enabled' });
      return;
    }

    const { assetId } = req.params;
    const userId = req.user!.userId;
    const { note } = req.body || {};

    // Validate asset exists
    const { rows: assetRows } = await pool.query(
      'SELECT id, event_id FROM rm_forecast_precomputed WHERE id = $1 AND status = $2',
      [assetId, 'ACTIVE']
    );

    if (assetRows.length === 0) {
      res.status(404).json({ error: 'Forecast asset not found' });
      return;
    }

    const eventId = assetRows[0].event_id;

    await pool.query(
      `INSERT INTO rm_user_clips (user_id, forecast_asset_id, event_id, note)
       VALUES ($1, $2, $3, $4)
       ON CONFLICT (user_id, forecast_asset_id) DO UPDATE SET note = COALESCE(EXCLUDED.note, rm_user_clips.note)`,
      [userId, assetId, eventId, note || null]
    );

    res.json({ clipped: true, assetId, eventId });
  } catch (err) {
    console.error('Clip error:', err);
    res.status(500).json({ error: 'Failed to clip forecast' });
  }
});

// DELETE /api/clipped/:assetId — unclip
router.delete('/:assetId', authMiddleware, async (req: Request, res: Response) => {
  try {
    if (!CLIPPED_ENABLED()) {
      res.status(400).json({ error: 'Clipped feature is not currently enabled' });
      return;
    }

    const { assetId } = req.params;
    const userId = req.user!.userId;

    await pool.query(
      'DELETE FROM rm_user_clips WHERE user_id = $1 AND forecast_asset_id = $2',
      [userId, assetId]
    );

    res.json({ clipped: false, assetId });
  } catch (err) {
    console.error('Unclip error:', err);
    res.status(500).json({ error: 'Failed to unclip forecast' });
  }
});

// GET /api/clipped — user's clipped list
router.get('/', authMiddleware, async (req: Request, res: Response) => {
  try {
    if (!CLIPPED_ENABLED()) {
      res.status(400).json({ error: 'Clipped feature is not currently enabled' });
      return;
    }

    const userId = req.user!.userId;

    const { rows } = await pool.query(
      `SELECT c.id, c.forecast_asset_id, c.event_id, c.note, c.clipped_at,
              p.player_name, p.team_side, p.forecast_type, p.confidence_score, p.league
       FROM rm_user_clips c
       LEFT JOIN rm_forecast_precomputed p ON p.id = c.forecast_asset_id
       WHERE c.user_id = $1
       ORDER BY c.clipped_at DESC`,
      [userId]
    );

    res.json({ clips: rows, count: rows.length });
  } catch (err) {
    console.error('Get clips error:', err);
    res.status(500).json({ error: 'Failed to fetch clips' });
  }
});

export default router;
