<?php

declare(strict_types=1);

/**
 * Hydrate the admin sales rule form with promo-rule extension attributes.
 */

namespace Autogedal\PromoRules\Plugin\SalesRule\Model;

use Autogedal\PromoRules\Api\Data\RuleConfigInterface;
use Autogedal\PromoRules\Api\RuleConfigRepositoryInterface;
use Autogedal\PromoRules\Model\Rule\DiscountScope;
use Magento\SalesRule\Model\Rule\DataProvider;

/**
 * Adds promo-rule values to the sales-rule form data.
 */
class DataProviderPlugin
{
    /**
     * @param RuleConfigRepositoryInterface $ruleConfigRepository
     */
    public function __construct(
        private readonly RuleConfigRepositoryInterface $ruleConfigRepository
    ) {
    }

    /**
     * Inject custom promo-rule data into the admin form payload.
     *
     * @param DataProvider $subject
     * @param array|null $result
     * @return array|null
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function afterGetData(DataProvider $subject, ?array $result): ?array
    {
        if (!is_array($result)) {
            return $result;
        }

        foreach ($result as $ruleId => $item) {
            if (!is_array($item) || !isset($item['rule_id'])) {
                continue;
            }

            try {
                $ruleConfig = $this->ruleConfigRepository->getByRuleId((int) $item['rule_id']);
            } catch (\Throwable) {
                $ruleConfig = null;
            }

            $item['extension_attributes'] ??= [];
            $item['extension_attributes'][RuleConfigInterface::USES_PER_EMAIL] = 0;
            $item['extension_attributes'][RuleConfigInterface::BLOCK_DISCOUNT_SCOPE] = DiscountScope::NONE;

            if ($ruleConfig !== null) {
                $item['extension_attributes'][RuleConfigInterface::USES_PER_EMAIL]
                    = max(0, $ruleConfig->getUsesPerEmail());
                $item['extension_attributes'][RuleConfigInterface::BLOCK_DISCOUNT_SCOPE]
                    = $ruleConfig->getBlockDiscountScope() ?: DiscountScope::NONE;
            }

            $result[$ruleId] = $item;
        }

        return $result;
    }
}
