<?php
// +----------------------------------------------------------------------
// | onezan-admin 快速开发的管理平台
// +----------------------------------------------------------------------
// | 官方网址：https://www.onezan.cn
// +----------------------------------------------------------------------
// | onezan团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: 543885307@qq.com
// +----------------------------------------------------------------------
namespace app\repository\system;

use app\repository\BaseRepository;
use Core\contract\ConfigStoreInterface;
use think\facade\Db;


/**
 * Config Repository
 * @package app\repository\system
 */
class ConfigRepository extends BaseRepository implements ConfigStoreInterface
{

    /**
     * 获取字符串配置值
     * @param string $key 配置键
     * @param string $default 默认值
     * @return string
     */
    public function getString(string $key, string $default = ''): string
    {
        try {
            $value = Db::name('sys_system_config')->where('key', $key)->value('value');
            if (is_string($value)) {
                return $value;
            }
            if ($value !== null) {
                return (string)$value;
            }
        } catch (\Throwable $e) {
        }

        return $default;
    }


    /**
     * 获取整数配置值
     * @param string $key 配置键
     * @param int $default 默认值
     * @return int
     */
    public function getInt(string $key, int $default = 0): int
    {
        try {
            $value = Db::name('sys_system_config')->where('key', $key)->value('value');
            if (is_numeric($value)) {
                return (int)$value;
            }
            if (is_string($value) && trim($value) !== '' && is_numeric(trim($value))) {
                return (int)trim($value);
            }
        } catch (\Throwable $e) {
        }

        return $default;
    }


    /**
     * 获取 JSON 配置
     * @param string $key
     * @param array $default
     * @return array
     */
    public function getJson(string $key, array $default = []): array
    {
        $raw = $this->getString($key, '');
        if ($raw === '') {
            return $default;
        }

        $decoded = json_decode($raw, true);
        return is_array($decoded) ? $decoded : $default;
    }


    /**
     * 设置字符串配置值
     * @param string $key 配置键
     * @param string $value 配置值
     * @param string $desc 描述说明
     * @return void
     */
    public function setValue(string $key, string $value, string $desc = ''): void
    {
        try {
            $exists = Db::name('sys_system_config')->where('key', $key)->find();
            if ($exists) {
                $update = ['value' => $value];
                if ($desc !== '') {
                    $update['desc'] = $desc;
                }
                Db::name('sys_system_config')->where('key', $key)->update($update);
                return;
            }
        } catch (\Throwable $e) {
        }

        try {
            Db::name('sys_system_config')->insert([
                'key' => $key,
                'value' => $value,
                'desc' => $desc,
            ]);
        } catch (\Throwable $e) {
        }
    }


    /**
     * 设置JSON配置值
     * @param string $key 配置键
     * @param array $value 配置值
     * @param string $desc 描述说明
     * @return void
     */
    public function setJson(string $key, array $value, string $desc = ''): void
    {
        $this->setValue(
            $key,
            json_encode($value, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
            $desc
        );
    }
}