<?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
{
    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();
    }

    /**
     * @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) : [];
    }
}
