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/DiscountActionService.php
<?php declare(strict_types=1);


namespace App\Discounts;


use App\Discounts\Actions\AbstractDiscountActionHandler;
use Illuminate\Support\Collection;

class DiscountActionService
{
    protected static ?Collection $actions = null;

    public static function registerHandler (int $discountActionEnum, string $discountAction): void {
        if(!self::$actions) self::$actions = new Collection();

        if(!self::isActionHandler($discountAction)) throw new \InvalidArgumentException('The given "discount action" must be, but is not a child of '.AbstractDiscountActionHandler::class);
        self::$actions[$discountActionEnum] = $discountAction;
    }

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

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

    public function dataByType() {
        return collect(self::$actions)->mapWithKeys(function ($class, $discountActionType) {
            return [$discountActionType => __('KMS::discounts.actionTypes.'.$discountActionType)];
        });
    }

    public function saveFromJsonArray(Discount $discount, array $data) {
        $discountActionClass = $className = get_class($discount->actions()->getRelated());

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

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

            return $action;
        })->filter(
            fn($action) => is_a($action, $discountActionClass)
        );
    }
}