<?php

class ListingBookmark
{
    private PDO $db;

    public function __construct()
    {
        $this->db = Database::getInstance();
    }

    public function isBookmarked(int $userId, int $listingId): bool
    {
        $stmt = $this->db->prepare('SELECT COUNT(*) FROM listing_bookmarks WHERE user_id = :user_id AND listing_id = :listing_id');
        $stmt->execute(['user_id' => $userId, 'listing_id' => $listingId]);
        return (int)$stmt->fetchColumn() > 0;
    }

    public function add(int $userId, int $listingId): bool
    {
        $stmt = $this->db->prepare('INSERT IGNORE INTO listing_bookmarks (user_id, listing_id) VALUES (:user_id, :listing_id)');
        return $stmt->execute(['user_id' => $userId, 'listing_id' => $listingId]);
    }

    public function remove(int $userId, int $listingId): bool
    {
        $stmt = $this->db->prepare('DELETE FROM listing_bookmarks WHERE user_id = :user_id AND listing_id = :listing_id');
        return $stmt->execute(['user_id' => $userId, 'listing_id' => $listingId]);
    }

    public function getByUser(int $userId): array
    {
        $stmt = $this->db->prepare(
            'SELECT l.*, u.username, u.display_name, u.avatar, co.label as condition_label, lb.created_at as bookmarked_at
             FROM listing_bookmarks lb
             JOIN listings l ON lb.listing_id = l.id
             JOIN users u ON l.user_id = u.id
             LEFT JOIN condition_options co ON l.condition_id = co.id
             WHERE lb.user_id = :user_id
             ORDER BY lb.created_at DESC'
        );
        $stmt->execute(['user_id' => $userId]);
        return $stmt->fetchAll();
    }

    public function countByUser(int $userId): int
    {
        $stmt = $this->db->prepare('SELECT COUNT(*) FROM listing_bookmarks WHERE user_id = :user_id');
        $stmt->execute(['user_id' => $userId]);
        return (int)$stmt->fetchColumn();
    }
}
