<?php

namespace App\Services;

use App\Models\Option;
use RuntimeException;

/**
 * Options Service - Manages default with set options
 */
class OptionsService
{
    public function get(string $optionKey)
    {
        $defaultOption = config('options.' . $optionKey);
        if ($defaultOption === null) {
            throw new RuntimeException('Default option not found!');
        }

        $option = Option::where('key', $optionKey)->first();

        if ($option === null) {
            return $defaultOption;
        }

        if (!is_array($defaultOption)) {
            if (is_array($option->data)) {
                return $defaultOption;
            } else {
                return $option->data;
            }
        }

        return array_replace_recursive($defaultOption, $option->data);
    }

    public function set(string $optionKey, $data)
    {
        $defaultOption = config('options.' . $optionKey);
        if ($defaultOption === null) {
            throw new RuntimeException('Default option not found!');
        }
        $option = Option::where('key', $optionKey)->first();

        if ($option === null) {
            $option = new Option();
            $option->key = $optionKey;
        }

        if (!is_array($defaultOption)) {
            if (is_array($data)) {
                throw new RuntimeException('Option data can\'t be an array!');
            }
            $option->data = $data;
        } else {
            if (!is_array($data)) {
                throw new RuntimeException('Option data has to be an array!');
            }

            $option->data = array_replace_recursive($defaultOption, $data);
        }

        $option->save();

        return $option->data;
    }
}
