<?php

namespace App\Http\Controllers;

use App\Http\Requests\SphinxSearchRequest;
use App\Models\Category;
use App\Models\Item;
use Foolz\SphinxQL\Drivers\Mysqli\Connection;
use Foolz\SphinxQL\SphinxQL;

class SphinxSearchController extends Controller
{
    public function search(SphinxSearchRequest $request)
    {
        $conn = (new Connection());
        $conn->setParams(['host' => env('SPHINX_HOST', '127.0.0.1'), 'port' => env('SPHINX_PORT', 9306)]);

//        $queryText = $request->searchText; // так работает леметайзер но как-то странно находит совпадения
        $queryText = $this->prepareQuery($request['searchText']); // так находит больше совпадений но не работает леметайзер

        $query = SphinxQL::create($conn)->select('*')->from(['items_light'])->match(['caption', 'description'], $queryText)->limit(0, 20);

        if ($request->subCat) {
            $query->where('subcategory_id', '=', (int)$request->subCat);
        }

        $result = $query->execute();

        $items = [];
        foreach ($result as $key => $value) {
            $items[] = $value['id'];
        }
        if (count($items) > 0) {
            $itemsList = Item::find($items);    // можно переделать под SHModel тогда должен возвращать модель
            $itemsList->load('picture');
        }


        return view('items.dashboard',
            [
                'itemsList' => $itemsList ?? null,
                'categories' => Category::with('subcategory')->get(),
            ]
        );
    }

    // ---------------------------- do not remove ------------------------------------

    // Select All items from index
    // $result = SphinxQL::create($conn)->select('*')->from('items')->limit(0,20)->execute();

    // запрос с выведением в масив полной информации о товаре... не оправдан, т.к. много информации а вывод в dashboard
    // происходит через модель а не масив, нужно переделывать dashboard под массивы
    // $query = SphinxQL::create($conn)->select('*')->from(['items'])->match(['caption', 'description'], $queryText)->limit(0, 20);

    // ---------------------------- do not remove ------------------------------------

    protected function prepareQuery(string $requestText)
    {
        $requestString = array_map(function ($val) {
            return "*" . $val . "*";
            //  return "(" . $val . " | *" . $val . "*)"; // этот запрос хуже ищет
        }, preg_split('/[\s,-]+/', $requestText));
        return implode(" & ", $requestString);
    }
}
