<?php
/** @noinspection CallableParameterUseCaseInTypeContextInspection */

namespace CouponsPlus\App\Coupon\Attributes\Factories;

use CouponsPlus\Original\Collections\Collection;
use CouponsPlus\Original\Characters\StringManager;
use CouponsPlus\App\Coupon\Attributes\Data\LocalAttributeData;
use CouponsPlus\app\coupon\attributes\abilities\AttributeValueData;
use CouponsPlus\App\Coupon\Attributes\Data\GlobalAttributeValueData;

class AttributeValuesDataFactory
{
    public function createFromArray(array $attributesAndValues) : Collection
    {
        return Collection::create($attributesAndValues)->map(function (string $valueSlug, string $attributeSlugFullyPrefixed) : AttributeValueData {
            $attributeSlugPrefixed = new StringManager($attributeSlugFullyPrefixed);

            if ($attributeSlugPrefixed->startsWith('attribute_')) {
                $attributeSlugPrefixed = $attributeSlugPrefixed->removeLeft('attribute_');
            }

            if ($attributeSlugPrefixed->startsWith('pa_')) {
                // create global attribute value
                return $this->createGlobalAttributeValue(
                    $attributeSlugPrefixed->removeLeft('pa_')->get(),
                    $valueSlug
                );
            }

            return $this->createLocalAttributeValue($attributeSlugPrefixed, $valueSlug);
        });
    }

    protected function createGlobalAttributeValue(string $attributeSlug, string $valueSlug) : AttributeValueData
    {
        $globalAttributeValueDataFactory = new GlobalAttributeValueDataFactory();
        $globalAttributeDataFactory = new GlobalAttributeDataFactory();

        $globalAttributeValueDataFactory->setAttributeData(
            $globalAttributeDataFactory->create($attributeSlug)
        );

        return $globalAttributeValueDataFactory->create($valueSlug);

    }
    protected function createLocalAttributeValue(string $attributeSlug, string $valueSlug) : AttributeValueData
    {
        $localAttributeValueDataFactory = new LocalAttributeValueDataFactory();

        $localAttributeValueDataFactory->setAttributeData(
            new LocalAttributeData($attributeSlug, [])
        );

        return $localAttributeValueDataFactory->create($valueSlug);

    }
}