<?php

namespace xmvc\test;

use xmvc\ErrorClass;

/**
 * 网址 Url 测试
 */
class UrlTest
{
    /**
     * 构造
     */
    public function __construct()
    {
        ;
    }

    /**
     * Request
     * @link HOST/xmvc/test/UrlTest-req.json
     */
    public function req()
    {
        //IThrow(); // 有错误时直接抛出
        ICheckAll();
        $result = I('a'); // MVC::$req['a'] 的值
        $result = I('a', ''); // 默认转义为安全字符
        //$result = I('a', '', ['type' => 'html']); // 不转义为安全字符
        //$result = is_null(I('a')) ? '缺失 a 参数' : I('a'); // 没有传参时默认返回 null
        //$result = I('a', '200'); // 如果没有传 a 参数, 则默认 200
        //$result = I('m', 0, ['must' => true]); // 必须传值
        //$result = I('m', '', ['must' => true, 'msgMust' => lg('必填')]); // 必须传值
        //$result = I('a', 0, ['type' => 'int']); // 只接受整型数字
        //$result = I('d', '', ['type' => 'date', 'msg' => '请输入一个日期']); // 只接受日期, 自定义返回消息
        //$result = I('a', '', ['type' => 'datetime']); // 只接受日期时间
        //$result = I('a', '', ['type' => 'time']); // 只接受时间
        //$result = I('a', 0, ['type' => 'number']); // 只接受数字, 整型或浮点型
        $result = I('a', 0, ['type' => 'int', 'min' => 5, 'max' => 10]); // 数值在 5 至 10 的范围
        //$result = I('x', null, ['type' => 'enum', 'enum' => ['Mr.', 'Ms.']]); // 枚举
        //$result = I('a', '', ['minLen' => 3, 'maxLen' => 20, 'msg' => lg('字符长度必须大于 3 小于 20')]); // 不提供type默认为string, 长度在 3 至 20 之间
        //$result = I('a', '', ['type' => 'json']); // json
        //$result = I('a', '', ['type' => 'email']);
        //$result = I('a', '', ['type' => 'ip']);
        //$result = I('url', 'http://www.abc.com', ['type' => 'url']);
        //$result = I('pass', 'Abc12..', ['type' => 'password']);
        //$result = I('a', '', ['type' => 'regex', 'regex' => '/\d{3}/']); // 自定义规则 - 正则表达式
        //$result = I('a', '', ['type' => 'callback', 'callback' => '\xmvc\test\UrlTest::mycheck1']); // 自定义规则函数 - class::callback($key, $value, $rules);
        //$result = I('a', '', ['type' => 'callback', 'callback' => '\xmvc\test\UrlTest->mycheck2']); // 自定义规则函数 - class::callback($key, $value, $rules);
        // hasPost(); // 提交参数的是否有 POST
        // postKeys(); // POST 提交的所有的键
        // hasPhpinput(); // 提交参数的是否是 php://input
        // phpinputKeys(); // php://input 提交的所有的键
        $error = IError();
        if (!is_null($error)) {
            //dd($error); // 错误信息
            //ErrorClass::errorMake($error[0]); // 抛出第一个错误
            //ErrorClass::errorMake($error[count($error) - 1]); // 抛出最后一个错误
            foreach ($error as $e) {
                //ErrorClass::errorMake($e); // 抛出所有错误
                dumpRN($e); // 打印错误
            }
            exit();
        }
        return R(['Result' => $result, 'error' => $error]);
    }
    public static function mycheck1($key, $value, $rules)
    {
        if ($value != 'abc') {
            return ('请输入abc');
        }
        return true;
    }
    public function mycheck2($key, $value, $rules)
    {
        if ($value != '123') {
            return ('请输入123');
        }
        return true;
    }

    /**
     * url() 函数
     */
    public function url()
    {
        $data['index'] = url('index');
        $data['self'] = url('self'); // 当前 网址
        $data['self+'] = url('self', ['a' => 1, 'b' => 2, 'test' => 'www']);
        $data['array'] = url('test/method-test', ['a' => 1, 'b' => 2]);
        $data['string'] = url('test/method-test', 'c-3~d-4');
        return R($data);
    }

    /**
     * 防 XSS 攻击
     * - /UrlTest-xss~script-"><script>alert`Hello`</script>.html
     * - 用 html 方式访问, html 模式才会转义
     */
    public function xss()
    {
        // 示例数据
        $variables = [
            'level1' => [
                'level2' => [
                    'key1' => 'value1',
                    'key2' => '<script>alert("XSS")</script>',
                ],
                'key3' => 'value3',
            ],
            'key4' => 'value4'
        ];
        $request = I('script');
        return R(['variables' => $variables, 'request' => $request]);
    }

    /**
     * 防 CRLF 攻击
     */
    public function crlf(string $test)
    {
        $token = getCsrfToken();
        return R(['token' => $token]);
    }
}
