HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/SBogers10/shop.komma.nl/app/Discounts/DiscountConditionService.php
<?php declare(strict_types=1);


namespace App\Discounts;


use App\Discounts\Conditions\AbstractDiscountConditionHandler;
use Illuminate\Support\Collection;

class DiscountConditionService
{
    protected static ?Collection $conditionHandlers = null;

    public static function registerHandler (int $discountConditionEnum, string $discountConditionHandler): void {
        if(!self::$conditionHandlers) self::$conditionHandlers = new Collection();

        if(!self::isConditionHandler($discountConditionHandler)) throw new \InvalidArgumentException('The given "discount condition" must be, but is not a child of '.AbstractDiscountConditionHandler::class);
        self::$conditionHandlers[$discountConditionEnum] = $discountConditionHandler;
    }

    public static function isConditionHandler (string $class): bool {
        return is_a($class, AbstractDiscountConditionHandler::class, true);
    }

    public function makeHandler (int $discountConditionEnum, ...$params): AbstractDiscountConditionHandler {
        if(!self::$conditionHandlers->keys()->contains($discountConditionEnum)) throw new \InvalidArgumentException('DiscountConditionType value '.$discountConditionEnum.' is not makable since it is unknown. Register it first');
        $class = (self::$conditionHandlers->get($discountConditionEnum));
        return new $class($params);
    }

    public function dataByType(): Collection {
        return collect(self::$conditionHandlers)->mapWithKeys(function ($class, $discountConditionType) {
            return [$discountConditionType => __('KMS::discounts.conditionTypes.'.$discountConditionType)];
        });
    }

    public function saveFromJsonArray(Discount $discount, array $data): Collection {
        $discountConditionClass = $className = get_class($discount->conditions()->getRelated());

        return collect($data)->map(function(array $data) use($discount, $discountConditionClass) {
            if(!array_key_exists('state', $data)) throw new \InvalidArgumentException('The data must contain a state attribute, but it did not contain it.');

            $condition = null;
            switch ($data['state']) {
                case Discount::NEW:
                    $condition = new $discountConditionClass;
                    $condition->fill($data);
                    $discount->conditions()->save($condition);
                    break;
                case Discount::PRISTINE:
                case Discount::DIRTY:
                    /** @var DiscountCondition|null $condition */
                    $condition = $discountConditionClass::find($data['id']);
                    if(!$condition) throw new \InvalidArgumentException('Data refers to a condition that does not exist anymore. Cannot save a '.$discountConditionClass);
                    $condition->fill($data);
                    $discount->conditions()->save($condition);
                    break;
                case Discount::DELETED:
                    $condition = $discountConditionClass::find($data['id']);
                    $condition->delete();
                    break;
            }

            return $condition;
        })->filter(
            fn($condition) => is_a($condition, $discountConditionClass)
        );
    }
}