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