<?php 
/** 
 * Copyright(c) 2019 SYSTEM_KD 
 * Date: 2019/07/27 
 */ 
 
namespace Plugin\PointExDx\EventSubscriber; 
 
 
use Eccube\Entity\Order; 
use Eccube\Event\TemplateEvent; 
use Plugin\PointExDx\Config\ConfigSetting; 
use Plugin\PointExDx\Service\PlgConfigService\ConfigService; 
use Plugin\PointExDx\Service\PointExDxHelper; 
use Plugin\PointExDx\Service\TwigRenderService\TwigRenderService; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
 
class ShoppingEventSubscriber implements EventSubscriberInterface 
{ 
 
    /** @var TwigRenderService */ 
    protected $twigRenderService; 
 
    /** @var ConfigService */ 
    protected $configService; 
 
    /** @var PointExDxHelper */ 
    protected $pointExHelper; 
 
    public function __construct( 
        TwigRenderService $twigRenderService, 
        ConfigService $configService, 
        PointExDxHelper $pointExHelper 
    ) 
    { 
        $this->twigRenderService = $twigRenderService; 
        $this->configService = $configService; 
        $this->pointExHelper = $pointExHelper; 
    } 
 
    /** 
     * ご注文手続きテンプレート 
     * 
     * @param TemplateEvent $event 
     */ 
    public function onTemplateShopping(TemplateEvent $event) 
    { 
        if (!$this->pointExHelper->isPointUse()) { 
            // ポイント利用が無効の場合表示しない 
            return; 
        } 
 
        if ($this->configService->isKeyBool(ConfigSetting::KEY_SHOPPING_VIEW)) { 
            $this->viewBonusPoint($event); 
        } 
    } 
 
    /** 
     * ご注文確認テンプレート 
     * 
     * @param TemplateEvent $event 
     */ 
    public function onTemplateShoppingConfirm(TemplateEvent $event) 
    { 
        if (!$this->pointExHelper->isPointUse()) { 
            // ポイント利用が無効の場合表示しない 
            return; 
        } 
 
        if ($this->configService->isKeyBool(ConfigSetting::KEY_CONFIRM_VIEW)) { 
            $this->viewBonusPoint($event); 
        } 
    } 
 
    private function viewBonusPoint(TemplateEvent $event) 
    { 
 
        /** @var Order $order */ 
        $order = $event->getParameter('Order'); 
        if (!$order->getCustomer()) { 
            // 会員購入でない場合 
            return; 
        } 
 
        $this->twigRenderService->initRenderService($event); 
 
        $child = $this->twigRenderService 
            ->eachChildBuilder() 
            ->findThis() 
            ->targetFindAndIndexKey('#point_ex_bonus_point_', 'pexIndex') 
            ->setInsertModeAppend(); 
 
        $this->twigRenderService 
            ->eachBuilder() 
            ->find('.ec-orderDelivery__item') 
            ->find('.ec-imageGrid') 
            ->find('.ec-imageGrid__content') 
            ->setEachIndexKey('pexIndex') 
            ->each($child->build()); 
 
        $this->twigRenderService->addSupportSnippet('@PointExDx/default/Shopping/index_ex.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 [ 
            'Shopping/index.twig' => ['onTemplateShopping', 10], 
            'Shopping/confirm.twig' => ['onTemplateShoppingConfirm', 10], 
        ]; 
    } 
}