<?php

namespace AmeliaBooking\Domain\Services\Settings;

use AmeliaBooking\Domain\Entity\Settings\Settings;
use AmeliaBooking\Domain\Factory\Settings\SettingsFactory;
use AmeliaBooking\Domain\ValueObjects\Json;

/**
 * Class SettingsService
 *
 * @package AmeliaBooking\Domain\Services\Settings
 */
class SettingsService
{
    public const NUMBER_OF_DAYS_AVAILABLE_FOR_BOOKING = 365;

    /** @var SettingsStorageInterface */
    private $settingsStorage;

    /**
     * SettingsService constructor.
     *
     * @param SettingsStorageInterface $settingsStorage
     */
    public function __construct(SettingsStorageInterface $settingsStorage)
    {
        $this->settingsStorage = $settingsStorage;
    }

    /**
     * @param      $settingCategoryKey
     * @param      $settingKey
     * @param null $defaultValue
     *
     * @return mixed|null
     */
    public function getSetting($settingCategoryKey, $settingKey, $defaultValue = null)
    {
        if (null !== $this->settingsStorage->getSetting($settingCategoryKey, $settingKey)) {
            return $this->settingsStorage->getSetting($settingCategoryKey, $settingKey);
        }

        return $defaultValue;
    }

    /**
     * @param $settingCategoryKey
     *
     * @return mixed|array
     */
    public function getCategorySettings($settingCategoryKey)
    {
        return $this->settingsStorage->getCategorySettings($settingCategoryKey);
    }

    /**
     * Return array of all settings where keys are settings names and values are settings values
     *
     * @return mixed
     */
    public function getAllSettings()
    {
        return $this->settingsStorage->getAllSettings();
    }

    /**
     * Return array of arrays where keys are settings categories names and values are categories settings
     *
     * @return mixed
     */
    public function getAllSettingsCategorized()
    {
        return $this->settingsStorage->getAllSettingsCategorized();
    }

    /**
     * @return mixed
     */
    public function getFrontendSettings()
    {
        return $this->settingsStorage->getFrontendSettings();
    }

    /**
     * @return mixed
     */
    public function getBackendSettings()
    {
        return $this->settingsStorage->getBackendSettings();
    }

    /**
     * @param $settingCategoryKey
     * @param $settingKey
     * @param $settingValue
     *
     * @return mixed
     */
    public function setSetting($settingCategoryKey, $settingKey, $settingValue)
    {
        return $this->settingsStorage->setSetting($settingCategoryKey, $settingKey, $settingValue);
    }

    /**
     * @param $settingCategoryKey
     * @param $settingValues
     *
     * @return mixed
     */
    public function setCategorySettings($settingCategoryKey, $settingValues)
    {
        return $this->settingsStorage->setCategorySettings($settingCategoryKey, $settingValues);
    }

    /**
     * @param $settings
     *
     * @return mixed
     */
    public function setAllSettings($settings)
    {
        return $this->settingsStorage->setAllSettings($settings);
    }

    /**
     * @param Json $entitySettingsJson
     *
     * @return Settings
     */
    public function getEntitySettings($entitySettingsJson)
    {
        return SettingsFactory::create($entitySettingsJson, $this->getAllSettingsCategorized());
    }

    /**
     * @param Json $entitySettingsJson
     *
     * @return Settings
     */
    public function getSavedSettings($entitySettingsJson)
    {
        $data = $entitySettingsJson ? json_decode($entitySettingsJson->getValue(), true) : [];

        $isOldEntitySettings = ! isset($data['activation']['version']);

        if ($isOldEntitySettings && isset($data['general']['minimumTimeRequirementPriorToCanceling'])) {
            $data['general']['minimumTimeRequirementPriorToRescheduling'] =
                $data['general']['minimumTimeRequirementPriorToCanceling'];
        }

        return $data;
    }

    /**
     * @param array $entities
     *
     * @return void
     */
    public function setStashEntities($entities)
    {
        update_option('amelia_stash', json_encode($entities));
    }

    /**
     * @return array
     */
    public function getStashEntities()
    {
        $entitiesStash = get_option('amelia_stash');

        return $entitiesStash ? json_decode($entitiesStash, true) : [];
    }

    public function isFeatureEnabled($feature)
    {
        // First check if the feature is enabled in settings
        $featureSettings = $this->getSetting('featuresIntegrations', $feature);

        if (!is_array($featureSettings) || !isset($featureSettings['enabled'])) {
            return false;
        }

        // If the feature is not enabled in settings, return false
        if (!$featureSettings['enabled']) {
            return false;
        }

        // Check if the current license has access to this feature
        // If not, the feature is considered disabled even if enabled in settings
        return \AmeliaBooking\Infrastructure\Licence\Licence::hasFeatureAccess($feature);
    }

    /**
     * @param array $settings
     *
     * @return void
     */
    public function fixCustomization(&$settings)
    {
        if (isset($settings['forms']) && $settings['forms']) {
            foreach ($settings['forms'] as $formName => &$form) {
                if (isset($form['confirmBookingForm'])) {
                    foreach ($form['confirmBookingForm'] as $entityName => &$entity) {
                        if (isset($entity['itemsStatic']['paymentMethodFormField']['switchPaymentMethodViewOptions'])) {
                            array_splice(
                                $settings['forms'][$formName]['confirmBookingForm'][$entityName]['itemsStatic']
                                ['paymentMethodFormField']['switchPaymentMethodViewOptions'],
                                2
                            );
                        }
                    }
                }
            }
        }
    }
}
