<?php
/**
 * SavedItem Model (Wishlist)
 * Maps to `saved_items` table
 */

require_once __DIR__ . '/../Core/Model.php';

class SavedItem extends Model {
    protected string $table = 'saved_items';

    public function getUserWishlist(int $userId): array {
        $sql = "SELECT si.id as saved_id, si.created_at as saved_at,
                p.*, s.store_name, s.store_slug, s.status as store_status,
                c.name as category_name,
                (SELECT image_path FROM `product_images` pi WHERE pi.product_id = p.id ORDER BY pi.is_main DESC, pi.sort_order ASC LIMIT 1) as gallery_image
                FROM `saved_items` si
                JOIN `products` p ON si.product_id = p.id
                JOIN `stores` s ON p.store_id = s.id
                LEFT JOIN `categories` c ON p.category_id = c.id
                WHERE si.user_id = :user_id AND p.deleted_at IS NULL
                ORDER BY si.created_at DESC";
        return $this->fetchAll($sql, [':user_id' => $userId]);
    }

    public function isSaved(int $userId, int $productId): bool {
        $sql = "SELECT id FROM `saved_items` WHERE user_id = :user_id AND product_id = :product_id LIMIT 1";
        return (bool)$this->fetchOne($sql, [':user_id' => $userId, ':product_id' => $productId]);
    }

    public function add(int $userId, int $productId): bool {
        $sql = "INSERT IGNORE INTO `saved_items` (`user_id`, `product_id`, `created_at`) VALUES (:user_id, :product_id, NOW())";
        $this->query($sql, [':user_id' => $userId, ':product_id' => $productId]);
        return true;
    }

    public function remove(int $userId, int $productId): bool {
        $sql = "DELETE FROM `saved_items` WHERE user_id = :user_id AND product_id = :product_id";
        $this->query($sql, [':user_id' => $userId, ':product_id' => $productId]);
        return true;
    }

    public function toggle(int $userId, int $productId): bool {
        if ($this->isSaved($userId, $productId)) {
            $this->remove($userId, $productId);
            return false; // Removed
        } else {
            $this->add($userId, $productId);
            return true; // Added
        }
    }
}
