<?php

namespace Give\API\REST\V3\Routes\Subscriptions\Actions;

use Give\Subscriptions\ValueObjects\SubscriptionPeriod;
use Give\Subscriptions\ValueObjects\SubscriptionStatus;

/**
 * @since 4.8.0
 */
class GetSubscriptionItemSchema
{
    /**
     * @since 4.10.0 added campaignId
     * @since 4.8.0
     */
    public function __invoke(): array
    {
        return [
            '$schema' => 'http://json-schema.org/draft-04/schema#',
            'title' => 'givewp/subscription',
            'description' => esc_html__('Subscription routes for CRUD operations', 'give'),
            'type' => 'object',
            'properties' => [
                'id' => [
                    'type' => 'integer',
                    'description' => esc_html__('Subscription ID', 'give'),
                ],
                'mode' => [
                    'type' => 'string',
                    'description' => esc_html__('Subscription mode (live or test)', 'give'),
                    'default' => 'live',
                    'enum' => ['live', 'test'],
                ],
                'campaignId' => [
                    'type' => 'integer',
                    'description' => esc_html__('Campaign ID', 'give'),
                    'nullable' => true,
                ],
                'donationFormId' => [
                    'type' => 'integer',
                    'description' => esc_html__('Donation form ID', 'give'),
                    'required' => true,
                ],
                'donorId' => [
                    'type' => 'integer',
                    'description' => esc_html__('Donor ID. Returns 0 for anonymous donors when data is redacted.', 'give'),
                    'required' => true,
                ],
                'firstName' => [
                    'type' => 'string',
                    'description' => esc_html__('Donor first name. Returns "anonymous" for anonymous donors when data is redacted.', 'give'),
                    'format' => 'text-field',
                ],
                'lastName' => [
                    'type' => 'string',
                    'description' => esc_html__('Donor last name. Returns "anonymous" for anonymous donors when data is redacted.', 'give'),
                    'format' => 'text-field',
                ],
                'amount' => [
                    'type' => 'object',
                    'properties' => [
                        'value' => [
                            'type' => 'number',
                            'description' => esc_html__('Amount in decimal format', 'give'),
                        ],
                        'valueInMinorUnits' => [
                            'type' => 'integer',
                            'description' => esc_html__('Amount in minor units (cents)', 'give'),
                        ],
                        'currency' => [
                            'type' => 'string',
                            'format' => 'text-field',
                            'description' => esc_html__('Currency code (e.g., USD, EUR)', 'give'),
                        ],
                    ],
                    'description' => esc_html__('Subscription amount', 'give'),
                    'required' => true,
                ],
                'feeAmountRecovered' => [
                    'type' => ['object', 'null'],
                    'properties' => [
                        'value' => [
                            'type' => 'number',
                            'description' => esc_html__('Fee amount in decimal format', 'give'),
                        ],
                        'valueInMinorUnits' => [
                            'type' => 'integer',
                            'description' => esc_html__('Fee amount in minor units (cents)', 'give'),
                        ],
                        'currency' => [
                            'type' => 'string',
                            'format' => 'text-field',
                            'description' => esc_html__('Currency code (e.g., USD, EUR)', 'give'),
                        ],
                    ],
                    'description' => esc_html__('Fee amount recovered', 'give'),
                ],
                'status' => [
                    'type' => 'string',
                    'description' => esc_html__('Subscription status', 'give'),
                    'enum' => ['any', ...array_values(SubscriptionStatus::toArray())],
                    'required' => true,
                ],
                'period' => [
                    'type' => 'string',
                    'description' => esc_html__('Subscription billing period', 'give'),
                    'enum' => array_values(SubscriptionPeriod::toArray()),
                    'required' => true,
                ],
                'frequency' => [
                    'type' => 'integer',
                    'description' => esc_html__('Billing frequency', 'give'),
                    'required' => true,
                ],
                'installments' => [
                    'type' => 'integer',
                    'description' => esc_html__('Number of installments (0 for unlimited)', 'give'),
                    'default' => 0,
                ],
                'transactionId' => [
                    'type' => ['string', 'null'],
                    'description' => esc_html__('Transaction ID. Returns empty string when sensitive data is excluded.', 'give'),
                    'format' => 'text-field',
                ],
                'gatewaySubscriptionId' => [
                    'type' => ['string', 'null'],
                    'description' => esc_html__('Gateway subscription ID. Returns empty string when sensitive data is excluded.', 'give'),
                    'format' => 'text-field',
                ],
                'gatewayId' => [
                    'type' => 'string',
                    'description' => esc_html__('Payment gateway ID', 'give'),
                    'format' => 'text-field',
                    'required' => true,
                ],
                'gateway' => [
                    'type' => ['object', 'null'],
                    'properties' => [
                        'id' => [
                            'type' => 'string',
                            'description' => esc_html__('Gateway ID', 'give'),
                        ],
                        'name' => [
                            'type' => 'string',
                            'description' => esc_html__('Gateway name', 'give'),
                        ],
                        'label' => [
                            'type' => 'string',
                            'description' => esc_html__('Payment method label', 'give'),
                        ],
                        'subscriptionUrl' => [
                            'type' => 'string',
                            'format' => 'uri',
                            'description' => esc_html__('Gateway dashboard subscription URL', 'give'),
                        ],
                        'canSync' => [
                            'type' => 'boolean',
                            'description' => esc_html__('Whether the gateway supports transaction synchronization', 'give'),
                        ],
                    ],
                    'description' => esc_html__('Payment gateway details. Returns null when gateway is not available or not registered.', 'give'),
                    'readonly' => true,
                ],
                'createdAt' => [
                    'type' => ['string', 'null'],
                    'description' => sprintf(
                        /* translators: %s: WordPress documentation URL */
                        esc_html__('Subscription creation date in ISO 8601 format. Follows WordPress REST API date format standards. See %s for more information.', 'give'),
                        '<a href="https://developer.wordpress.org/rest-api/extending-the-rest-api/schema/#format" target="_blank">WordPress REST API Date and Time</a>'
                    ),
                    'format' => 'date-time',
                    'example' => '2025-09-02T20:27:02',
                ],
                'renewsAt' => [
                    'type' => ['string', 'null'],
                    'description' => sprintf(
                        /* translators: %s: WordPress documentation URL */
                        esc_html__('Next renewal date in ISO 8601 format. Follows WordPress REST API date format standards. See %s for more information.', 'give'),
                        '<a href="https://developer.wordpress.org/rest-api/extending-the-rest-api/schema/#format" target="_blank">WordPress REST API Date and Time</a>'
                    ),
                    'format' => 'date-time',
                    'example' => '2025-09-02T20:27:02',
                ],
                'projectedAnnualRevenue' => [
                    'type' => 'object',
                    'properties' => [
                        'value' => [
                            'type' => 'number',
                            'description' => esc_html__('Projected annual revenue in decimal format', 'give'),
                        ],
                        'valueInMinorUnits' => [
                            'type' => 'integer',
                            'description' => esc_html__('Projected annual revenue in minor units (cents)', 'give'),
                        ],
                        'currency' => [
                            'type' => 'string',
                            'format' => 'text-field',
                            'description' => esc_html__('Currency code (e.g., USD, EUR)', 'give'),
                        ],
                    ],
                    'description' => esc_html__('Projected annual revenue for this subscription', 'give'),
                    'readonly' => true,
                ],
            ],
        ];
    }
}
