      1:   2:   3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:
                 33:  34:
                 35:  36:  37:  38:  39:  40:  41:  42:  43:  44:  45:  46:
                 47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74:  75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:
                 91:  92:  93:  94:  95:  96:  97:  98:  99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143:

    <?php

    /*
     * This file is part of the affilinet Product Data PHP SDK.
     *
     * For the full copyright and license information, please view the LICENSE
     * file that was distributed with this source code.
     */

    namespace Affilinet\ProductData\Responses\ResponseElements;

    use Affilinet\ProductData\Requests\ProductsRequestInterface;

    class FacetValue implements FacetValueInterface
    {

        /**
         * @var string
         */
        private $value;

        /**
         * @var integer
         */
        private $resultCount;

        /**
         * @var FacetInterface
         */
        private $facet;

        /**
         * FacetValue constructor.
         * @param array          $facetValue
         * @param FacetInterface $facet
         */
        public function __construct(array $facetValue, FacetInterface $facet)
        {
            $this->value = $facetValue['FacetValueName'];
            $this->resultCount = $facetValue['FacetValueCount'];
            $this->facet = $facet;

        }

        /**
         * @return string
         */
        public function getDisplayValue()
        {
            switch ($this->getFacet()->getName()) {
                case 'ShopCategoryPathFacet':
                case 'AffilinetCategoryPathFacet':
                    $values = explode('^', $this->value);
                    if ($values[3] === $values[1]) return $values[1];
                    return $values[3];
                    break;
            }

            return $this->getValue();
        }

        /**
         * @return FacetInterface
         */
        public function getFacet()
        {
            return $this->facet;
        }

        /**
         * @return string
         */
        public function getValue()
        {
            return $this->value;
        }

        /**
         * @return int
         */
        public function getResultCount()
        {
            return $this->resultCount;
        }

        /**
         * Returns the serialized ProductsRequest to retrieve the results behind this facet value
         * Starting with "?" for usage as URI Query Parameter
         *
         * @param  ProductsRequestInterface $request
         * @return string
         */
        public function generateQueryString(ProductsRequestInterface $request)
        {
            return '?' . $this->generateSerializedProductsRequest($request);
        }

        /**
         * Returns the serialized ProductsRequest to retrieve the results behind this facet value
         *
         * @param  ProductsRequestInterface $request
         * @return string
         */
        public function generateSerializedProductsRequest(ProductsRequestInterface $request)
        {
            $newRequest = clone $request;

            switch ($this->getFacet()->getName()) {
                case 'ShopName':
                case 'ProgramId':
                    // There is no valid filter Query for these facets, add debug log

                    $request->getAffilinetClient()
                        ->getLog()
                        ->addDebug(
                            'You can not filter SearchProducts with '
                            . $this->getFacet()->getName()
                            . ' Seems like you used this facet and tried to generate a Link or a ProductsRequest for this facets\' results.'
                        );

                    break;
                case 'ShopId':

                    $newRequest->onlyFromShopIds([$this->getValue()]);
                    break;

                case 'ShopCategoryId':
                    $newRequest->onlyFromCategories([$this->getValue()], false, false);
                    break;

                case 'AffilinetCategoryId':
                    $newRequest->onlyFromCategories([$this->getValue()]);
                    break;

                default :
                    $newRequest->addFilterQuery($this->getFacet()->getName(), $this->getValue());

            }

            return $newRequest->serialize();
        }
    }