<?php
namespace Give\API\REST\V3\Routes\Subscriptions\Fields;
use DateTime;
use Give\Framework\Exceptions\Primitives\InvalidArgumentException;
use Give\Framework\Support\ValueObjects\Money;
use Give\Subscriptions\ValueObjects\SubscriptionMode;
use Give\Subscriptions\ValueObjects\SubscriptionPeriod;
use Give\Subscriptions\ValueObjects\SubscriptionStatus;
/**
* @since 4.8.0
*/
class SubscriptionFields
{
/**
* Process field values for special data types before setting them on the subscription model.
*
* @since 4.8.0
*/
public static function processValue(string $key, $value)
{
switch ($key) {
case 'amount':
case 'feeAmountRecovered':
if (is_array($value)) {
// Handle Money object array format: ['value' => 100.00, 'currency' => 'USD']
if (isset($value['value']) && isset($value['currency'])) {
return Money::fromDecimal($value['value'], $value['currency']);
}
}
return $value;
case 'status':
if (is_string($value) && SubscriptionStatus::isValid($value)) {
return new SubscriptionStatus($value);
}
return $value;
case 'period':
if (is_string($value)) {
return new SubscriptionPeriod($value);
}
return $value;
case 'mode':
if (is_string($value) && SubscriptionMode::isValid($value)) {
return new SubscriptionMode($value);
}
return $value;
case 'gatewayId':
// Gateway ID is a simple string, no special processing needed
return $value;
case 'createdAt':
case 'renewsAt':
try {
if (is_string($value)) {
return new DateTime($value, wp_timezone());
} elseif (is_array($value)) {
return new DateTime($value['date'], new \DateTimeZone($value['timezone']));
}
} catch (\Exception $e) {
throw new InvalidArgumentException("Invalid date format for {$key}: {$value}.");
}
return $value;
default:
return $value;
}
}
}