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)
);
}
}