<?php

namespace Lc\SovBundle\EventSubscriber;

use Doctrine\ORM\EntityManagerInterface;
use Lc\SovBundle\Definition\SiteSettingDefinitionInterface;
use Lc\SovBundle\Factory\Setting\SiteSettingFactory;
use Lc\SovBundle\Factory\Site\SiteFactory;
use Lc\SovBundle\Repository\Setting\SiteSettingRepository;
use Lc\SovBundle\Repository\Site\SiteRepository;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;

class SiteSettingEventSubscriber implements EventSubscriberInterface
{
    protected $em;
    protected $siteSettingDefinition;
    protected $siteSettingFactory;
    protected $siteSettingRepository;
    protected $siteRepository;
    protected $siteFactory;

    public function __construct(
            EntityManagerInterface $em,
            SiteSettingRepository $siteSettingRepository,
            SiteRepository $siteRepository,
            SiteSettingDefinitionInterface $siteSettingDefinition,
            SiteSettingFactory $siteSettingFactory,
            SiteFactory $siteFactory
    ) {
        $this->em = $em;
        $this->siteSettingDefinition = $siteSettingDefinition;
        $this->siteSettingFactory = $siteSettingFactory;
        $this->siteSettingRepository = $siteSettingRepository;
        $this->siteRepository = $siteRepository;
        $this->siteFactory = $siteFactory;
    }

    public static function getSubscribedEvents()
    {
        return [
                KernelEvents::CONTROLLER => ['initSettings']
        ];
    }

    public function initSettings()
    {
        $site = $this->getSiteDefault();
        if (!$site) {
            $site = $this->siteFactory->create('default');
            $this->em->persist($site);
            $this->em->flush($site);
        }

        $settings = $this->siteSettingDefinition->getSettings();
        $factory = $this->siteSettingFactory;

        foreach ($settings as $category => $settingList) {
            foreach ($settingList as $settingName => $setting) {
                $entitySetting = $site->getSetting($settingName);

                if (!$entitySetting) {

                    $text = null;
                    $date = null;
                    $file = null;

                    $fieldValue = isset($setting['default']) ? $setting['default'] : null;

                    if($setting['field'] == 'text') {
                        $text = $fieldValue;
                    }
                    if($setting['field'] == 'date') {
                        $date = $fieldValue;
                    }
                    if($setting['field'] == 'file') {
                        $file = $fieldValue;
                    }

                    $entitySetting = $factory->create($site, $setting['name'], $text, $date, $file);

                    $this->em->persist($entitySetting);
                } else {
                    if ($entitySetting->getValue() === null
                            && isset($setting['default'])
                            && $setting['default'] !== null) {
                        $methodSetValue = 'set' . ucfirst($setting['field']);
                        $entitySetting->$methodSetValue($setting['default']);
                        $this->em->update($entitySetting);
                    }
                }
            }
        }


        $this->em->flush();
    }

    public function getSiteDefault()
    {
        return $this->siteRepository->findOneByDevAlias('default');
    }

}