<?php 
/** 
 * Copyright(c) 2022 SYSTEM_KD 
 * Date: 2022/11/26 
 */ 
 
namespace Plugin\OrderStatusEx\EventSubscriber; 
 
 
use Eccube\Event\EccubeEvents; 
use Eccube\Event\EventArgs; 
use Plugin\OrderStatusEx\Entity\OrderStatusEvent; 
use Plugin\OrderStatusEx\Repository\OrderStatusEventRepository; 
use Plugin\OrderStatusEx\Service\OrderStatusExConfigService; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
 
class SearchEventSubscriber implements EventSubscriberInterface 
{ 
 
    /** @var OrderStatusEventRepository */ 
    protected $orderStatusEventRepository; 
 
    /** @var OrderStatusExConfigService */ 
    protected $orderStatusExConfigService; 
 
    public function __construct( 
        OrderStatusEventRepository $orderStatusEventRepository, 
        OrderStatusExConfigService $orderStatusExConfigService 
    ) 
    { 
        $this->orderStatusEventRepository = $orderStatusEventRepository; 
        $this->orderStatusExConfigService = $orderStatusExConfigService; 
    } 
 
    public function onAdminAdminIndexOrder(EventArgs $event) 
    { 
        $excludes = $event->getArgument('excludes'); 
 
 
        if ($this->orderStatusExConfigService->isStrictMode()) { 
            // 直接保持モード 
            $status = [ 
                OrderStatusEvent::EVENT_GROUP_CANCEL, 
                OrderStatusEvent::EVENT_GROUP_RETURN, 
                OrderStatusEvent::EVENT_GROUP_DELIVERY, 
            ]; 
            $orderStatusExEvents = $this->orderStatusEventRepository->findOrderStatusEvents($status); 
 
        } else { 
            // 標準へ集約するため追加分は全て除く 
            $orderStatusExEvents = $this->orderStatusEventRepository->getNoDefaultOrderStatus(); 
        } 
 
        /** @var OrderStatusEvent $orderStatusExEvent */ 
        foreach ($orderStatusExEvents as $orderStatusExEvent) { 
 
            $targetOrderStatusId = $orderStatusExEvent->getOrderStatusId(); 
            $excludes[] = $targetOrderStatusId; 
        } 
 
        $event->setArgument('excludes', $excludes); 
    } 
 
    public function onAdminAdminIndexSales(EventArgs $event) 
    { 
        $excludes = $event->getArgument('excludes'); 
 
        // 取消・返品相当のステータス追加 
        $orderStatusExEvents = $this->orderStatusEventRepository->getNoOrderStatusEvents(); 
 
        /** @var OrderStatusEvent $orderStatusExEvent */ 
        foreach ($orderStatusExEvents as $orderStatusExEvent) { 
 
            $targetOrderStatusId = $orderStatusExEvent->getOrderStatusId(); 
            $excludes[] = $targetOrderStatusId; 
        } 
 
        $event->setArgument('excludes', $excludes); 
    } 
 
    public static function getSubscribedEvents() 
    { 
        return [ 
            // ホーム 件数一覧 
            EccubeEvents::ADMIN_ADMIM_INDEX_ORDER => 'onAdminAdminIndexOrder', 
            // ホーム 売上状況 
            EccubeEvents::ADMIN_ADMIM_INDEX_SALES => 'onAdminAdminIndexSales', 
        ]; 
    } 
}