<?php
namespace Fobia\Database\SphinxConnection;

use Foolz\SphinxQL\Facet;
use Foolz\SphinxQL\Helper;
use Foolz\SphinxQL\SphinxQL;
use Illuminate\Database\MySqlConnection;

class SphinxConnection extends MySqlConnection
{
    protected $sphinxQLConnection;

    public function getSphinxQLDriversConnection()
    {
        if (null === $this->sphinxQLConnection) {
            $this->sphinxQLConnection = new SphinxQLDriverConnection($this->getPdo());
        }
        return $this->sphinxQLConnection;
    }

    public function getSphinxQLHelper()
    {
        return new Helper($this->getSphinxQLDriversConnection());
    }

    public function createSphinxQL()
    {
        return new SphinxQL($this->getSphinxQLDriversConnection());
    }

    public function createFacet()
    {
        return new Facet($this->getSphinxQLDriversConnection());
    }

    public function replace($query, $bindings = [])
    {
        return $this->statement($query, $bindings);
    }

    /**
     * Run a select statement against Manticore/Sphinx using PDO::query()
     * instead of prepare()+execute() to avoid binary protocol issues.
     */
    public function select($query, $bindings = [], $useReadPdo = true)
    {
        return $this->run($query, $bindings, function ($query, $bindings) use ($useReadPdo) {
            $statement = $this->getPdo()->query($query);
            return $statement->fetchAll(\PDO::FETCH_OBJ);
        });
    }

    public function statement($query, $bindings = [])
    {
        return $this->run($query, $bindings, function ($query, $bindings) {
            return $this->getPdo()->exec($query) !== false;
        });
    }

    public function affectingStatement($query, $bindings = [])
    {
        return $this->run($query, $bindings, function ($query, $bindings) {
            return $this->getPdo()->exec($query);
        });
    }

    protected function getDefaultQueryGrammar()
    {
        return new \Fobia\Database\SphinxConnection\Eloquent\Query\Grammar();
    }

    public function query()
    {
        return new \Fobia\Database\SphinxConnection\Eloquent\Query\Builder(
            $this,
            $this->getQueryGrammar(),
            $this->getPostProcessor()
        );
    }
}
