<?php

namespace xmvc\test;

use xmvc\MVC;
use xmvc\Cache;

/**
 * 缓存测试
 */
class CacheTest
{
    protected $type;
    protected $dns = [];

    /**
     * 构造
     */
    public function __construct()
    {
        $this->type = 'redis'; // file, apcu, redis
        $this->dns = 'redis.local'; // 用于 redis, 而 file, apcu 这项为''
    }

    /** 文件缓存 */
    public function file()
    {
        $cacheFile = new Cache();
        $cacheFile->setCacheFileDir('test'); // 设置相对于 DIR_CACHE . /files/ 的缓存存储的目录, 此处目录为 DIR_CACHE . /files/test
        // $cacheFile->setCacheFileAbsDir('/home/wwwroot/test'); // 设置缓存存储的绝对目录
        // 字符串
        $stringKey = 'testString';
        $cacheFile->saveCacheFile($stringKey, "字符串\r\nString");
        $dataString = $cacheFile->getCacheFile($stringKey);
        //$cacheFile->deleteCacheFile($arrayKey);

        // 数组
        $arrayKey = 'testArray';
        $cacheFile->saveCacheFile($arrayKey, ['a', 'b', 'c' => [1, 2, 3, 4, 5, 6]]);
        $dataArray = $cacheFile->getCacheFile($arrayKey);

        // 对象
        $objectKey = 'testObject';
        $obj = new \stdClass();
        $obj->name = 'user1';
        $obj->time = time();
        $cacheFile->saveCacheFile($objectKey, $obj);
        $dataObject = $cacheFile->getCacheFile($objectKey);

        //$cacheFile->deleteAllCacheFile(true); // 清除当前缓存目录所有缓存文件, 参数 $deleteSelf = false 表示不删除当前缓存目录, 默认 true
        return R([
            $stringKey => $dataString,
            $arrayKey => $dataArray,
            $objectKey => $dataObject,
        ]);
    }

    /** 键值缓存 */
    public function keyValue()
    {
        $type = $this->type;
        $dns = $this->dns;
        $groupName = 'group1';
        $data = [];
        /*
        //加载指定文件
        $cache = Cache::create($type, $groupName, $dns);
        //$cache->loadFromFile(DIR_RUNTIME . '/test.php');
        $data['A']['value'] = $cache->get('A'); // 取值
        $data['A']['time'] = date('Y-m-d H:i:s', $cache->getTime('A')); // 取写入缓存的时间
        $data['A']['both'] = $cache->getBoth('A'); // [值,写入缓存的时间]
        $data['E']['name']['value'] = $cache->get('E.name'); // 取数组子值,只支持二级(一个点号)
        $data['E']['name']['time'] = $cache->getTime('E.name'); // time 为 E 的整体 time
        $data['E']['ALL'] = $cache->get('E'); // 取值
        $data['ALL'] = $cache->getAll(); // 默认缓存的所有键值
        return R($data);
        */
        if (Cache::exists($type, $groupName, $dns)) {
            $cache = Cache::create($type, $groupName, $dns);
            $data['A']['value'] = $cache->get('A'); // 取值
            $data['A']['time'] = date('Y-m-d H:i:s', $cache->getTime('A')); // 取写入缓存的时间
            $data['A']['both'] = $cache->getBoth('A'); // [值,写入缓存的时间]

            $cache->set('E.name', '张三2')->save(); // 修改E.name 的值
            $cache->remove('E.age')->save(); // 删除 E.age
            $data['E']['name']['value'] = $cache->get('E.name'); // 取数组子值,只支持二级(一个点号)
            $data['E']['name']['time'] = $cache->getTime('E.name'); // time 为 E 的整体 time
            $data['F']['0'] = $cache->get('F.0'); // 取 F 第一个元素值
            $cache->set('F.1', ['color' => 'green2'])->save(); // 修改 F 第二个元素的值
            $cache->remove('F.0')->save(); // 删除 F 第一个元素值
            $data['F']['1'] = $cache->get('F.1'); // 取 F 第二个元素值
            $data['F']['2'] = $cache->get('F.2'); // 取 F 第三个元素值
            $data['F']['2-4'] = $cache->get('F.2-4'); // 取 F 第三至第五个元素值
            $data['F']['3-'] = $cache->get('F.3-'); // 取 F 第四至后面所有
            $data['F']['-4'] = $cache->get('F.-4'); // 取 F 开始至第五个元素
            $data['F']['count'] = $cache->get('F.count'); // 取 F 的长度

            $data['ALL'] = $cache->getAll(); // 默认缓存的所有键值
            if ($cache->exists('C')) {
                $cache->remove('C'); // 删除键 C
                $cache->save();
            }
            // $cache->saveToFile(DIR_RUNTIME . '/test.php'); 保存缓存到文件
        } else {
            $uniqid = uniqid();
            $bArr = [1, 2, 3, 4, 5];
            $eArr = ['name' => '张三', 'age' => 1, 'score' => [1, 2, 3, 4, 5]];
            $fArr = [
                ['color' => 'red'],
                ['color' => 'green'],
                ['color' => 'blue'],
                ['color' => 'black'],
                ['color' => 'white'],
                ['color' => 'purple'],
                ['color' => 'yellow'],
            ];
            $cache = Cache::create($type, $groupName, $dns);
            $cache->set('A', $uniqid);
            $cache->set('B', $bArr);
            $cache->set('C', 1);
            $cache->set('D', true);
            $cache->set('E', $eArr);
            $cache->set('F', $fArr);
            $cache->save();
            $data[] = ['新保存 A ', $uniqid];
            $data[] = ['新保存 B ', $bArr];
            $data[] = ['新保存 C ', 1];
            $data[] = ['新保存 D ', 'true'];
            $data[] = ['新保存 E ', $eArr];
            $data[] = ['新保存 F ', $fArr];
        }
        return R($data);
    }
}
