<?php

namespace app\common\arw\adjfut\src\Service;

use think\helper\Arr;
use think\Model;
use think\Service;
use think\Validate as ThinkValidate;
use app\common\arw\adjfut\src\Exception\ErrorMsg;

class Validate extends Service
{
    /**
     * 启动方法
     * 在所有的系统服务注册完成之后调用，用于定义启动某个系统服务之前需要做的操作
     *
     * @return void
     * @date 2022-07-25
     * @example
     * @author arw
     * @since 1.0.0
     */
    public function boot(): void
    {
        ThinkValidate::maker(function (ThinkValidate $validate) {
            /**
             * 验证数据
             * 验证规则
             * 全部数据（数组）
             * 字段名
             * 字段描述
             */
            $validate->extend('string', function ($value) {
                return is_string($value);
            }, ':attribute 数据类型非法 不是字符串');

            $validate->extend('json', function ($value) {
                try {
                    $value = json_decode($value, true);
                    return is_array($value);
                } catch (\Throwable $th) {
                    // throw $th;
                }
                return false;
            }, ':attribute 数据格式错误 不是json字符串');

            $validate->extend('modelHas', function ($value, $rule) {
                $rules = explode(',', $rule);
                $class = Arr::get($rules, 0);
                $pk = Arr::get($rules, 1);
                if (!class_exists($class)) {
                    throw new ErrorMsg("$class 类不存在");
                }
                /**
                 * @var \think\Model
                 */
                $model = new $class;
                if (!($model instanceof Model)) {
                    throw new ErrorMsg("$class 该类未继承 \\think\\Model");
                }
                if (!$pk) {
                    $pk = $model->getPk();
                }
                return (bool) $model->where($pk, $value)->value($pk);
            }, ':attribute 数据不存在');
        });
    }
}
