<?php

namespace Webkul\WooCommerceBundle\EventListener;

use Symfony\Component\EventDispatcher\GenericEvent;
use Webkul\WooCommerceBundle\Entity\EntityTracker;
use Webkul\WooCommerceBundle\Services\WooCommerceConnector;

class EntityModificationListener
{
    private $em;
    protected $connectorService;

    public function __construct($em, WooCommerceConnector $connectorService)
    {
        $this->em = $em;
        $this->connectorService = $connectorService;
    }

    public function onPostSave(GenericEvent $event)
    {
        $subject = $event->getSubject();
        
        $id = $subject->getId();

        if (class_exists('Akeneo\Component\Versioning\Model\Version')) {
            $versionClass = 'Akeneo\Component\Versioning\Model\Version';
        } elseif (class_exists('Akeneo\Tool\Component\Versioning\Model\Version')) {
            $versionClass = 'Akeneo\Tool\Component\Versioning\Model\Version';
        }
        
        if (get_class($subject) === $versionClass) {
            if ($subject->getContext() === 'Deleted') {
                $snapshot = $subject->getSnapshot();

                $resourceName = $subject->getResourceName();

                $action = 'delete';
                $entity = $this->getEntityByClassName($resourceName);
                $code = $snapshot['code'] ?? ($snapshot['sku']);
            }
        } else {
            $action = 'save';
            $entity = $this->getEntityByClassName(get_class($subject));
            $code = method_exists($subject, 'getCode') ? $subject->getCode() : (method_exists($subject, 'getIdentifier') ? $subject->getIdentifier() : null);
        }

        if (!empty($entity) && !empty($code)) {
            $this->updateOrCreateTrackByEntityCodeAndAction($entity, $code, $action);
        }
    }

    protected function getEntityByClassName($className)
    {
        $entity = null;
        if (preg_match('#Category$#', $className)) {
            $entity = 'category';
        } elseif (preg_match('#Attribute$#', $className)) {
            $entity = 'attribute';
        } elseif (preg_match('#AttributeOption$#', $className)) {
            $entity = 'option';
        } elseif (preg_match('#Family$#', $className)) {
            $entity = 'family';
        } elseif (preg_match('#AttributeGroup$#', $className)) {
            $entity = 'group';
        } elseif (preg_match('#Product$#', $className)) {
            $entity = 'product';
        } elseif (preg_match('#ProductModel$#', $className)) {
            $entity = 'product';
        } else {
            // don't do anything
            return;
        }

        return $entity;
    }

    protected function updateOrCreateTrackByEntityCodeAndAction($entity, $code, $action)
    {
        // var_dump($code);die;
        $repo = $this->em->getRepository('WooCommerceBundle:EntityTracker');
        $track = $repo->findOneBy(['entityType' => $entity, 'code' => $code]);
        $shopUrls = json_encode($this->connectorService->getShopUrls(), true);
        
        if (!$track) {
            $track = new EntityTracker();
        }
        $track->setEntityType($entity);
        $track->setCode($code);
        $track->setAction($action);
        $track->setShopUrl($shopUrls);
        $this->em->persist($track);
        $this->em->flush();
    }

    public function onPostRemove(GenericEvent $event)
    {
        $subject = $event->getSubject();
        $id = $subject->getId();

        if (class_exists('Pim\Bundle\CatalogBundle\Entity\AttributeOption')) {
            $versionClass = 'Pim\Bundle\CatalogBundle\Entity\AttributeOption';
        } elseif (class_exists('Akeneo\Pim\Structure\Component\Model\AttributeOption')) {
            $versionClass = 'Akeneo\Pim\Structure\Component\Model\AttributeOption';
        }
        // var_dump(get_class($subject));die;
        if (get_class($subject) === $versionClass) {
            // var_dump(get_class($subject));die;
            $action = 'delete';
            $entity = 'option';
            $code = $subject->getCode();
        }

        if (!empty($entity) && !empty($code)) {
            // var_dump($action);die;
            $this->updateOrCreateTrackByEntityCodeAndAction($entity, $code, $action);
        }
    }
}
