<?php

namespace Mibazarow\Bxstore\Controller;

use Bitrix\Main\Engine\Controller;
use Bitrix\Main\Engine\Response;
use Bitrix\Main\Error;
use Bitrix\Main\Web\Json;
use Mibazarow\Bxstore\Service\CatalogSortService;

/**
 * Контроллер AJAX-сортировки каталога.
 */
class CatalogSortController extends Controller
{
    protected function getDefaultPreFilters(): array
    {
        return [];
    }

    public function applyAction(CatalogSortService $service): Response\Component|array
    {
        $request = $this->getRequest();
        $field = (string)$request->get('field');
        $order = (string)$request->get('order');

        if ($field === '') {
            $this->addError(new Error('Не указано поле сортировки'));
            return [];
        }

        // Сохраняем сортировку в cookie
        $service->setSort($field, $order);

        // params: может быть массивом (из BX.ajax.runAction data) или JSON-строкой
        $rawParams = $request->get('params');

        // Если нет параметров — просто подтверждаем сохранение
        if (empty($rawParams)) {
            return ['success' => true];
        }

        // Нормализуем: массив JSON-строка
        if (is_array($rawParams)) {
            $catalogParams = $rawParams;
        } elseif (is_string($rawParams)) {
            try {
                $catalogParams = Json::decode($rawParams);
            } catch (\Exception) {
                $this->addError(new Error('Некорректные параметры каталога'));
                return [];
            }
        } else {
            $this->addError(new Error('Некорректные параметры каталога'));
            return [];
        }

        if (!is_array($catalogParams)) {
            $this->addError(new Error('Некорректные параметры каталога'));
            return [];
        }

        $catalogParams['ELEMENT_SORT_FIELD'] = $field;
        $catalogParams['ELEMENT_SORT_ORDER'] = $order;
        $catalogParams['ELEMENT_SORT_FIELD2'] = 'id';
        $catalogParams['ELEMENT_SORT_ORDER2'] = $order;

        // Обновляем catalog.section с новыми параметрами
        return $this->renderComponentAjax(
            'bitrix:catalog.section',
            'bulletins',
            $catalogParams
        );
    }
}