import { sql } from '@vercel/postgres';
import jwt from 'jsonwebtoken';
import { JWT_SECRET } from '../../lib/auth-secret.js';

export default async function handler(req, res) {
  // Verify authentication
  const authHeader = req.headers.authorization;
  if (!authHeader || !authHeader.startsWith('Bearer ')) {
    return res.status(401).json({ error: 'Authentication required' });
  }

  const token = authHeader.substring(7);
  let user;
  try {
    user = jwt.verify(token, JWT_SECRET);
  } catch (error) {
    return res.status(401).json({ error: 'Invalid token' });
  }

  try {
    if (req.method === 'GET') {
      // Get user's favorites
      const { type } = req.query; // Optional filter by type
      
      let result;
      if (type) {
        result = await sql`
          SELECT uf.*, 
                 CASE 
                   WHEN uf.item_type = 'collection' THEN c.name
                   WHEN uf.item_type = 'card' THEN cards.name
                   WHEN uf.item_type = 'deck' THEN d.name
                 END as item_name
          FROM user_favorites uf
          LEFT JOIN collections c ON uf.item_type = 'collection' AND uf.item_id = c.id
          LEFT JOIN cards ON uf.item_type = 'card' AND uf.item_id = cards.id
          LEFT JOIN decks d ON uf.item_type = 'deck' AND uf.item_id = d.id
          WHERE uf.user_id = ${user.userId} AND uf.item_type = ${type}
          ORDER BY uf.created_at DESC
        `;
      } else {
        result = await sql`
          SELECT uf.*, 
                 CASE 
                   WHEN uf.item_type = 'collection' THEN c.name
                   WHEN uf.item_type = 'card' THEN cards.name
                   WHEN uf.item_type = 'deck' THEN d.name
                 END as item_name
          FROM user_favorites uf
          LEFT JOIN collections c ON uf.item_type = 'collection' AND uf.item_id = c.id
          LEFT JOIN cards ON uf.item_type = 'card' AND uf.item_id = cards.id
          LEFT JOIN decks d ON uf.item_type = 'deck' AND uf.item_id = d.id
          WHERE uf.user_id = ${user.userId}
          ORDER BY uf.created_at DESC
        `;
      }
      
      res.status(200).json({
        favorites: result.rows
      });

    } else if (req.method === 'POST') {
      // Add favorite
      const { itemType, itemId } = req.body;

      if (!itemType || !itemId) {
        return res.status(400).json({ error: 'itemType and itemId are required' });
      }

      if (!['card', 'collection', 'deck'].includes(itemType)) {
        return res.status(400).json({ error: 'Invalid itemType. Must be card, collection, or deck' });
      }

      // Check if already favorited
      const existing = await sql`
        SELECT id FROM user_favorites 
        WHERE user_id = ${user.userId} AND item_type = ${itemType} AND item_id = ${itemId}
      `;

      if (existing.rows.length > 0) {
        return res.status(409).json({ error: 'Item already favorited' });
      }

      // Add favorite
      const result = await sql`
        INSERT INTO user_favorites (user_id, item_type, item_id)
        VALUES (${user.userId}, ${itemType}, ${itemId})
        RETURNING *
      `;

      res.status(201).json({
        favorite: result.rows[0]
      });

    } else if (req.method === 'DELETE') {
      // Remove favorite
      const { itemType, itemId } = req.body;

      if (!itemType || !itemId) {
        return res.status(400).json({ error: 'itemType and itemId are required' });
      }

      const result = await sql`
        DELETE FROM user_favorites 
        WHERE user_id = ${user.userId} AND item_type = ${itemType} AND item_id = ${itemId}
        RETURNING *
      `;

      if (result.rows.length === 0) {
        return res.status(404).json({ error: 'Favorite not found' });
      }

      res.status(200).json({
        message: 'Favorite removed',
        favorite: result.rows[0]
      });

    } else {
      res.status(405).json({ error: 'Method not allowed' });
    }

  } catch (error) {
    console.error('Favorites API error:', error);
    res.status(500).json({ error: 'Internal server error' });
  }
} 