<?php
/**
 * *
 *  * ============================================================================
 *  * Created by PhpStorm.
 *  * User: Ice
 *  * 邮箱: ice@sbing.vip
 *  * 网址: https://sbing.vip
 *  * Date: 2019/9/19 下午3:53
 *  * ============================================================================.
 */
declare(strict_types=1);

namespace app\common\middleware;

use Closure;
use think\facade\Lang;
use think\Request;
use think\Response;
use think\facade\Env;
use think\facade\Cookie;
use think\facade\Config;

/**
 * Fast初始化，Admin/Index/Addon都会执行此方法，除了Api.
 */
class FastInit
{
    /**
     * Fast6框架初始化.
     *
     * @param Request $request
     * @param Closure $next
     *
     * @return Response
     */
    public function handle($request, Closure $next)
    {
        // 设置mbstring字符编码
        mb_internal_encoding('UTF-8');

        // 修复多语言
        app()->lang = new \think\Lang(app(),\config('lang'));
        // app()->lang->detect($request);
        app()->lang->switchLangSet(Lang::getLangSet());

        // 设置替换内容
        $this->initReplaceString();
        //设置DEBUG环境
        $this->initDebugEnv();
        // 切换多语言
        if ($request->get('lang')) {
            Cookie::set('think_var', $request->get('lang'));
        }
        // Form别名
        if (! class_exists('Form')) {
            class_alias('fast\\Form', 'Form');
        }

        return $next($request);
    }

    /**
     * 模板内容替换
     */
    private function initReplaceString(){
        // 设置替换字符串
        $url = ltrim(dirname(app()->request->root()), DIRECTORY_SEPARATOR);
        // 如果未设置__CDN__则自动匹配得出
        $tpl_replace_string = Config::get('view.tpl_replace_string');
        if (!Config::get('view.tpl_replace_string.__CDN__')) {
            $tpl_replace_string['__CDN__']=$url;
        }
        // 如果未设置__PUBLIC__则自动匹配得出
        if (!Config::get('view.tpl_replace_string.__PUBLIC__')) {
            $tpl_replace_string['__PUBLIC__']= $url . '/';
        }
        // 如果未设置__ROOT__则自动匹配得出
        if (!Config::get('view.tpl_replace_string.__ROOT__')) {
            $tpl_replace_string['__ROOT__']= preg_replace("/\/public\/$/", '', $url . '/');
        }
        Config::set(['tpl_replace_string'=>$tpl_replace_string],'view');
        if (! Config::get('site.cdnurl')) {
            Config::set(['cdnurl' => $url], 'site');
        }
        // 如果未设置cdnurl则自动匹配得出
        if (! Config::get('upload.cdnurl')) {
            Config::set(['cdnurl' => $url], 'upload');
        }
    }

    /**
     * 调试模式缓存
     */
    private function initDebugEnv(){
        if (Env::get('APP_DEBUG')) {
            // 如果是调试模式将version置为当前的时间戳可避免缓存
            Config::set(['version' => time()], 'site');
            //如果是调试模式将关闭视图缓存
            Config::set(['tpl_cache' => false], 'view');
            // 如果是开发模式那么将异常模板修改成官方的
            Config::set(['exception_tmpl' => app()->getThinkPath().'tpl/think_exception.tpl']);
        }
    }
}
