<?php
namespace frontend\controllers;

use Yii;
use yii\web\Controller;
use yii\web\NotFoundHttpException;

/**
 * 默认控制器，在配置文件的defaultRoute设置
 */
class ChController extends BaseController
{
    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            [
                'class' => 'yii\filters\HttpCache',
                'only' => ['index'],
                'lastModified' => function ($action, $params) {
                    return time() - 1;
                },
                'cacheControlHeader' => 'public, max-age=300',
            ],
        ];
    }

    public function actionIndex()
    {
        if (Yii::$app->request->url === '/') {
            return $this->redirect('/ch/');
        }
        return $this->render('/site/index');
    }
    
    /**
     * 错误处理器
     * @return string|\yii\web\Response
     */
    public function actionError()
    {
        $handler = Yii::$app->getErrorHandler();
        $exception = $handler->exception;
        if ($exception == null) {
            // 没有异常
            $exception = new NotFoundHttpException();
        }
        $response = Yii::$app->getResponse();
        $response->setStatusCodeByException($exception);
        
        // AJAX请求的话，不重定向，也不读取静态文件
        if (Yii::$app->request->isAjax) {
            return;
        }

        $url = rtrim(Yii::$app->request->url, '/');
        
        // 去掉后缀
        $suffix = '.html';
        if (strrpos($url, $suffix) === strlen($url) - strlen($suffix)) {
            $url = strstr($url, $suffix, true);
            $url_has_suffix = true;
        } else {
            $url_has_suffix = false;
        }

        // 前缀
        $prefix = '/ch';
        if (strpos($url, $prefix) === 0) {
            if ($url === $prefix) {
                $response->setStatusCode(200);
                return $this->render('/site/index');
            } else {
                $path = substr($url, strlen($prefix));
            }
            $url_has_prefix = true;
        } else {
            $path = $url;
            $url_has_prefix = false;
        }

        // 以前缀开头的话，读取相应的控制器和方法
        // 比如/ch/foo/bar-baz，如果存在对应的控制器和方法，则路由等同于foo/bar-baz
        if ($url_has_prefix && substr($url, strlen($prefix), 1) === '/') {
            $createControllerResult = Yii::$app->createController(substr($url, strlen($prefix) + 1));
            if ($createControllerResult) {
                /** @var \yii\web\Controller $controller */
                list($controller, $actionId) = $createControllerResult;
                $action = $controller->createAction($actionId);
                if ($action) {
                    $response->setStatusCode(200);
                    $actionMethod = $action->actionMethod;
                    return $controller->$actionMethod();       
                }
            }
        }

        // 文章列表页，以/a_开头，注意，在新创建的控制器里不能echo，否则会报500错误
        if (strpos($path, '/a_') === 0) {
            list($controller, $actionId) = Yii::$app->createController('article/actionList');
            $response->setStatusCode(200);
            return $controller->$actionId();
        }

        if ($url_has_suffix) {
            // 文章详情页，以/ad_开头，以.html结尾，注意，在新创建的控制器里不能echo，否则会报500错误
            if (strpos($path, '/ad_') === 0) {
                list($controller, $actionId) = Yii::$app->createController('article/actionDetail');
                $response->setStatusCode(200);
                return $controller->$actionId();
            }
        }
        
        // 文件存在的话，直接读取文件内容
        $file = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . 'html' . DIRECTORY_SEPARATOR . 'site' . $path . $suffix;
        if (file_exists($file)) {
            // 跳转到以/ch开头的网址
            if (!$url_has_prefix) {
                return $this->redirect('/ch' . $url);
            }
            
            $response->setStatusCode(200);
            return $this->renderFile($file);
        }
        
        // 文件不存在的话，跳转到首页
        return $this->redirect('/ch');
    }
    
}
