<?php

namespace Mibazarow\Bxstore\Service;

use Bitrix\Main\Context;
use Bitrix\Main\Web\Cookie;
use Bitrix\Main\Web\Json;

/**
 * Управлении сортировкой каталога через cookie.
 */
class CatalogSortService
{
    private const COOKIE_NAME = 'CATALOG_SORT';
    private const COOKIE_LIFETIME = 60 * 60 * 24 * 30; // 30 дней

    private array $default = [
        'field' => 'id',
        'order' => 'desc',
    ];

    // Возвращает текущие настройки сортировки из cookie.
    public function getSort(): array
    {
        $request = Context::getCurrent()->getRequest();
        $raw = (string)$request->getCookie(self::COOKIE_NAME);

        if ($raw === '') {
            return $this->default;
        }

        try {
            $data = Json::decode($raw);
            if (!is_array($data) || empty($data['field'])) {
                return $this->default;
            }
            return [
                'field' => (string)$data['field'],
                'order' => (string)($data['order'] ?? 'desc'),
            ];
        } catch (\Exception) {
            return $this->default;
        }
    }

    // Устанавливает сортировку в cookie.
    public function setSort(string $field, string $order): void
    {
        $order = strtolower($order) === 'asc' ? 'asc' : 'desc';

        $cookie = new Cookie(
            self::COOKIE_NAME,
            Json::encode(['field' => $field, 'order' => $order]),
            time() + self::COOKIE_LIFETIME
        );
        $cookie->setHttpOnly(false);
        $cookie->setPath('/');

        Context::getCurrent()->getResponse()->addCookie($cookie);
    }

    // Сбрасывает сортировку на значения по умолчанию.
    public function resetSort(): void
    {
        $cookie = new Cookie(
            self::COOKIE_NAME,
            '',
            time() - 86400
        );
        $cookie->setPath('/');

        Context::getCurrent()->getResponse()->addCookie($cookie);
    }
}