<?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 Lc\SovBundle\Repository\Site\SiteStore;
use Lc\SovBundle\Solver\Setting\SettingSolver;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;

class SiteSettingEventSubscriber implements EventSubscriberInterface
{
    protected EntityManagerInterface $entityManager;
    protected SiteSettingDefinitionInterface $siteSettingDefinition;
    protected SiteSettingFactory $siteSettingFactory;
    protected SiteSettingRepository $siteSettingRepository;
    protected SiteStore $siteStore;
    protected SiteFactory $siteFactory;
    protected SettingSolver $settingSolver;

    public function __construct(
            EntityManagerInterface $entityManager,
            SiteSettingRepository $siteSettingRepository,
            SiteStore $siteStore,
            SiteSettingDefinitionInterface $siteSettingDefinition,
            SiteSettingFactory $siteSettingFactory,
            SiteFactory $siteFactory,
            SettingSolver $settingSolver
    ) {
        $this->entityManager = $entityManager;
        $this->siteSettingDefinition = $siteSettingDefinition;
        $this->siteSettingFactory = $siteSettingFactory;
        $this->siteSettingRepository = $siteSettingRepository;
        $this->siteStore = $siteStore;
        $this->siteFactory = $siteFactory;
        $this->settingSolver = $settingSolver;
    }

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

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

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

        foreach ($settings as $category => $settingList) {
            foreach ($settingList as $settingName => $setting) {
                $entitySetting = $this->settingSolver->getSetting($site, $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->entityManager->persist($entitySetting);
                } else {
                    $methodGetValue = 'get' . ucfirst($setting['field']);
                    if ($entitySetting->$methodGetValue() === null
                            && isset($setting['default'])
                            && $setting['default'] !== null) {
                        $methodSetValue = 'set' . ucfirst($setting['field']);
                        $entitySetting->$methodSetValue($setting['default']);
                        $this->entityManager->update($entitySetting);
                    }
                }
            }
        }

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

    public function getSiteDefault()
    {
        return $this->siteStore->getOneByDevAlias('default');
    }

}