<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Cache;

/**
 * App\Models\Config
 *
 * @property int $id
 * @property int $type_id config_types.id
 * @property string $name 配置名称
 * @property string $alias 别名
 * @property string $value 配置值
 * @property int $listorder 排序
 * @property string $input_type 组件类型
 * @property string $default_value 默认值
 * @property string|null $option_values 提供的选择项:json对象{"name":"value"}
 * @property string|null $tips 帮助信息
 * @property string|null $placeholder placeholder
 * @property string|null $rules 验证规则
 * @property string|null $rule_messages 验证错误信息json对象
 * @property \Illuminate\Support\Carbon|null $created_at
 * @property \Illuminate\Support\Carbon|null $updated_at
 * @property string|null $deleted_at
 * @method static bool|null forceDelete()
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Config newModelQuery()
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Config newQuery()
 * @method static \Illuminate\Database\Query\Builder|\App\Models\Config onlyTrashed()
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Config query()
 * @method static bool|null restore()
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Config whereAlias($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Config whereCreatedAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Config whereDefaultValue($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Config whereDeletedAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Config whereId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Config whereInputType($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Config whereListorder($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Config whereName($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Config whereOptionValues($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Config wherePlaceholder($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Config whereRuleMessages($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Config whereRules($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Config whereTips($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Config whereTypeId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Config whereUpdatedAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Config whereValue($value)
 * @method static \Illuminate\Database\Query\Builder|\App\Models\Config withTrashed()
 * @method static \Illuminate\Database\Query\Builder|\App\Models\Config withoutTrashed()
 * @mixin \Eloquent
 */
class Config extends Model
{
    use SoftDeletes;

    public function getOptionValuesAttribute($value)
    {
        if (empty($value)) {
            return [];
        }
        if (is_null(json_decode($value, true))) {
            return $value;
        }
        return json_decode($value, true);
    }

    public function getRuleMessagesAttribute($value)
    {
        return json_decode($value, true)?:[];
    }

    public static function buildConfig()
    {
        $types=ConfigType::where('parent', 0)->get();
        $configs=[];
        foreach ($types as $type) {
            $configs[$type->alias]=[];
            foreach ($type->subTypes as $secondType) {
                $configs[$type->alias][$secondType->alias]=[];
                foreach ($secondType->subTypes as $thirdType) {
                    $configs[$type->alias][$secondType->alias][$thirdType->alias]=[];
                    foreach ($thirdType->configs as $config) {
                        $configs[$type->alias][$secondType->alias][$thirdType->alias][$config->alias]
                            =$config->value?:$config->default_value;
                    }
                }
            }
        }
        Cache::set('system_config', $configs);
        config($configs);
        return $configs;
    }
}