<?php

declare(strict_types=1);

namespace External\PompoBundle\Overrides\GraphQL\Util;

use KupShop\GraphQLBundle\ApiAdmin\Types\Parameters;
use Query\Operator;
use Query\QueryBuilder;

class UserUtil extends \KupShop\GraphQLBundle\ApiAdmin\Util\UserUtil
{
    /**
     * Přidává custom filtry na query pro načtení uživatelů.
     *
     * pompoId - filtr podle čísla zákazníka (id_drs)
     * pompoCard - filtr podle čísla zákaznické karty (user_cards)
     */
    protected function createUserCollectionFilter(int $offset, int $limit, ?Parameters $sort, ?Parameters $filter): callable
    {
        $specs = [];

        $pompoId = $filter?->getData()['pompoId'] ?? [];
        $pompoCard = $filter?->getData()['pompoCard'] ?? [];

        // custom filtr podle cisla zakaznika
        if (!empty($pompoId)) {
            $specs[] = function (QueryBuilder $qb) use ($pompoId) {
                $qb->join('u', 'drs_users', 'du', 'u.id = du.id_user');

                return Operator::inStringArray($pompoId, 'du.id_drs');
            };
        }

        // custom filtr podle cisla karty
        if (!empty($pompoCard)) {
            $specs[] = function (QueryBuilder $qb) use ($pompoCard) {
                $qb->join('u', 'user_cards', 'uc', 'u.id = uc.id_user');

                return Operator::andX(
                    Operator::equals(['uc.active' => 1]),
                    Operator::inStringArray($pompoCard, 'uc.code')
                );
            };
        }

        $filter?->remove('pompoId');
        $filter?->remove('pompoCard');

        $specs[] = parent::createUserCollectionFilter($offset, $limit, $sort, $filter);

        return Operator::andX($specs);
    }
}
