<?php

class SavedSearch
{
    private PDO $db;

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

    public function getByUser(int $userId): array
    {
        $stmt = $this->db->prepare(
            'SELECT * FROM saved_searches WHERE user_id = :user_id ORDER BY created_at DESC'
        );
        $stmt->execute(['user_id' => $userId]);
        $rows = $stmt->fetchAll();
        foreach ($rows as &$r) {
            $r['filters_decoded'] = $r['filters_json'] ? json_decode($r['filters_json'], true) : [];
        }
        return $rows;
    }

    public function findById(int $id): ?array
    {
        $stmt = $this->db->prepare('SELECT * FROM saved_searches WHERE id = :id LIMIT 1');
        $stmt->execute(['id' => $id]);
        $row = $stmt->fetch();
        return $row ?: null;
    }

    public function create(int $userId, string $name, array $filters): int
    {
        $stmt = $this->db->prepare(
            'INSERT INTO saved_searches (user_id, name, filters_json) VALUES (:user_id, :name, :filters_json)'
        );
        $stmt->execute([
            'user_id'      => $userId,
            'name'         => mb_substr($name, 0, 150),
            'filters_json' => json_encode($filters, JSON_UNESCAPED_UNICODE),
        ]);
        return (int)$this->db->lastInsertId();
    }

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

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

    public function searchByUser(int $userId, string $query = ''): array
    {
        if (empty($query)) {
            return $this->getByUser($userId);
        }

        $stmt = $this->db->prepare(
            'SELECT * FROM saved_searches 
             WHERE user_id = :user_id 
             AND (name LIKE :query OR filters_json LIKE :query)
             ORDER BY created_at DESC'
        );
        $stmt->execute([
            'user_id' => $userId,
            'query' => '%' . $query . '%'
        ]);
        $rows = $stmt->fetchAll();
        foreach ($rows as &$r) {
            $r['filters_decoded'] = $r['filters_json'] ? json_decode($r['filters_json'], true) : [];
        }
        return $rows;
    }
}
