<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
declare(strict_types=1);

namespace Magento\Paypal\Block\Express\InContext;

use Magento\Paypal\Model\Config;
use Magento\Paypal\Model\ConfigFactory;
use Magento\Framework\View\Element\Template;
use Magento\Catalog\Block\ShortcutInterface;
use Magento\Framework\View\Element\Template\Context;
use Magento\Framework\Serialize\SerializerInterface;
use Magento\Paypal\Model\SmartButtonConfig;
use Magento\Framework\UrlInterface;

/**
 * Class Button
 */
class SmartButton extends Template implements ShortcutInterface
{
    private const ALIAS_ELEMENT_INDEX = 'alias';

    /**
     * @var Config
     */
    private $config;

    /**
     * @var SerializerInterface
     */
    private $serializer;

    /**
     * @var SmartButtonConfig
     */
    private $smartButtonConfig;

    /**
     * @var UrlInterface
     */
    private $urlBuilder;

    /**
     * @param Context $context
     * @param ConfigFactory $configFactory
     * @param SerializerInterface $serializer
     * @param SmartButtonConfig $smartButtonConfig
     * @param UrlInterface $urlBuilder
     * @param array $data
     */
    public function __construct(
        Context $context,
        ConfigFactory $configFactory,
        SerializerInterface $serializer,
        SmartButtonConfig $smartButtonConfig,
        UrlInterface $urlBuilder,
        array $data = []
    ) {
        parent::__construct($context, $data);

        $this->config = $configFactory->create();
        $this->config->setMethod(Config::METHOD_EXPRESS);
        $this->serializer = $serializer;
        $this->smartButtonConfig = $smartButtonConfig;
        $this->urlBuilder = $urlBuilder;
    }

    /**
     * Check is Paypal In-Context Express Checkout button should render in cart/mini-cart
     *
     * @return bool
     */
    private function shouldRender(): bool
    {
        $isInCatalog = $this->getIsInCatalogProduct();
        $isInContext = (bool)(int) $this->config->getValue('in_context');

        return ($isInContext && $isInCatalog);
    }

    /**
     * @inheritdoc
     */
    protected function _toHtml()
    {
        if (!$this->shouldRender()) {
            return '';
        }

        return parent::_toHtml();
    }

    /**
     * Get shortcut alias
     *
     * @return string
     */
    public function getAlias()
    {
        return $this->getData(self::ALIAS_ELEMENT_INDEX);
    }

    /**
     * Returns string to initialize js component
     *
     * @return string
     */
    public function getJsInitParams(): string
    {
        $clientConfig = [
            'button' => 1,
            'getTokenUrl' => $this->urlBuilder->getUrl(
                'paypal/express/getTokenData',
                ['_secure' => $this->getRequest()->isSecure()]
            ),
            'onAuthorizeUrl' => $this->urlBuilder->getUrl(
                'paypal/express/onAuthorization',
                ['_secure' => $this->getRequest()->isSecure()]
            ),
            'onCancelUrl' => $this->urlBuilder->getUrl(
                'paypal/express/cancel',
                ['_secure' => $this->getRequest()->isSecure()]
            )
        ];
        $smartButtonsConfig = $this->smartButtonConfig->getConfig('product');
        $clientConfig = array_replace_recursive($clientConfig, $smartButtonsConfig);
        $config = [
            'Magento_Paypal/js/in-context/product-express-checkout' => [
                'clientConfig' => $clientConfig
            ]
        ];

        return $this->serializer->serialize($config);
    }
}