<?php
/**
 * Copyright(c) 2019 SYSTEM_KD
 * Date: 2019/07/20
 */
namespace Plugin\PointEx\EventSubscriber;
use Eccube\Entity\Product;
use Eccube\Event\TemplateEvent;
use Plugin\PointEx\Config\ConfigSetting;
use Plugin\PointEx\Service\PlgConfigService\ConfigService;
use Plugin\PointEx\Service\PointExHelper;
use Plugin\PointEx\Service\TwigRenderService\TwigRenderService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ProductDetailEventSubscriber implements EventSubscriberInterface
{
    /** @var TwigRenderService */
    protected $twigRenderService;
    /** @var ConfigService */
    protected $configService;
    /** @var PointExHelper */
    protected $pointExHelper;
    public function __construct(
        TwigRenderService $twigRenderService,
        ConfigService $configService,
        PointExHelper $pointExHelper
    )
    {
        $this->twigRenderService = $twigRenderService;
        $this->configService = $configService;
        $this->pointExHelper = $pointExHelper;
    }
    /**
     * 商品詳細テンプレート
     *
     * @param TemplateEvent $event
     */
    public function onTemplateProductDetail(TemplateEvent $event)
    {
        if (!$this->pointExHelper->isPointUse()) {
            // ポイント利用が無効の場合表示しない
            return;
        }
        if ($this->configService->isKeyBool(ConfigSetting::KEY_DETAIL_VIEW)) {
            $this->twigRenderService->initRenderService($event);
            /** @var Product $Product */
            $Product = $event->getParameter('Product');
            if ($Product->getCodeMin()) {
                // 商品コード下にボーナスポイント表示追加
                $findKey = '.ec-productRole__code';
            } else {
                // 販売価格の下にボーナスポイント表示追加
                $findKey = '.ec-productRole__price';
            }
            $this->twigRenderService
                ->insertBuilder()
                ->find($findKey)
                ->eq(0)
                ->setTargetId('ec-productRole__bonus_point')
                ->setInsertModeAfter();
            $this->twigRenderService->addSupportSnippet(
                '@PointEx/default/Product/detail_add.twig',
                '@PointEx/default/Product/detail_add_js.twig'
            );
            $event->addAsset('@PointEx/default/Product/detail_add_css.twig');
        }
    }
    /**
     * Returns an array of event names this subscriber wants to listen to.
     *
     * The array keys are event names and the value can be:
     *
     *  * The method name to call (priority defaults to 0)
     *  * An array composed of the method name to call and the priority
     *  * An array of arrays composed of the method names to call and respective
     *    priorities, or 0 if unset
     *
     * For instance:
     *
     *  * ['eventName' => 'methodName']
     *  * ['eventName' => ['methodName', $priority]]
     *  * ['eventName' => [['methodName1', $priority], ['methodName2']]]
     *
     * @return array The event names to listen to
     */
    public static function getSubscribedEvents()
    {
        return [
            "Product/detail.twig" => ['onTemplateProductDetail'],
        ];
    }
}