<?php

use Action\AbstractAction;
use LibModels\Wap\Passport\RegData;
use Plugin\Helpers;

/**
 * 注册的控制器
 */
class RegController extends AbstractAction
{

    /**
     * 注册页
     */
    public function indexAction()
    {
        // 设置注册有效时间30分钟, 防机器刷
        $this->setSession('_REG_EXPIRE', time() + 1800);

        $this->setTitle('注册');

        $data = array();
        $data['regIndex'] = true; // 模板中使用JS的标识
        $data['backUrl'] = 'javascript:history.go(-1)'; // 返回的URL链接
        $data['headerText'] = '注册'; // 头部信息
        $data['isPassportPage'] = true; // 模板中模块标识
        $data['areaCode'] = '+86'; // 默认的区号
        $data['countrys'] = RegData::getAreasData(); // 地区信息列表

        $refer = $this->get('refer');
        if (!empty($refer)) {
            $this->setCookie('refer', $refer);
        }

        // 生成HTML(reg.html)
        //$this->_view->html('reg');
        // 渲染模板
        $this->_view->display('index', $data);
    }

    /**
     * 验证码
     * 
     * @param string areaCode 地区编号
     * @param string phoneNum 手机号
     * @param string token 访问TOKEN凭证
     */
    public function codeAction()
    {
        $token = $this->get('token');
        $mobile = $this->get('phoneNum');
        $area = $this->get('areaCode', '86');

        // 判断是否允许访问, 不允许则跳转到错误页面
        if (!is_string($token) || !is_numeric($mobile) || !Helpers::verifyToken($mobile, $token)) {
            $this->error();
        }

        $this->setTitle('注册-验证码');

        $data = array(
            'regCode' => true, // 模板中使用JS的标识
            'backUrl' => SITE_MAIN . '/?go=1', // 返回的URL链接
            'headerText' => '注册', // 头部信息
            'isPassportPage' => true, // 模板中模块标识
            'areaCode' => '+' . $area, // 地区编号
            'phoneNum' => $mobile, // 手机号
            'token' => $token, // 访问令牌
        );

        $this->_view->display('code', $data);
    }

    /**
     * 填写密码页面
     * 
     * @param string areaCode 地区编号
     * @param string phoneNum 手机号
     * @param string token 访问TOKEN凭证
     */
    public function passwordAction()
    {
        $token = $this->get('token');
        $mobile = $this->get('phoneNum');
        $area = $this->get('areaCode', '86');

        // 判断是否允许访问, 不允许则跳转到错误页面
        if (!is_string($token) || !is_numeric($mobile) || !is_numeric($area) || !Helpers::verifyToken($mobile, $token)) {
            $this->error();
        }

        $this->setTitle('注册-设置密码');

        $data = array(
            'regPwd' => true, // 模板中使用JS的标识
            'backUrl' => '/', // 返回的URL链接
            'headerText' => '注册', // 头部信息
            'isPassportPage' => true, // 模板中模块标识
            'areaCode' => $area, // 地区编号
            'phoneNum' => $mobile, // 手机号
            'token' => $token, // 访问令牌
        );

        $this->_view->display('password', $data);
    }

    /**
     * 验证注册的手机号
     * 
     * @param string areaCode 地区编号,注意不需要+号
     * @param string phoneNum 手机号
     * @return json
     */
    public function verifymobileAction()
    {
        $data = array('code' => 400, 'message' => '手机号已存在', 'data' => '');

        do {
            /* 判断是不是AJAX请求 */
            if (!$this->isAjax()) {
                break;
            }

            $mobile = $this->post('phoneNum');
            $area = $this->post('areaCode', '86');
            /* 判断参数是否合法 */
            if (!is_numeric($mobile) || !is_numeric($area)) {
                break;
            }

            /* 设置注册有效时间30分钟, 防机器刷 */
            $expire = $this->getSession('_REG_EXPIRE');
            if (empty($expire) || $expire < time()) {
                break;
            }

            /* 向手机发送注册验证码 */
            $data = RegData::sendCodeToMobile($area, $mobile);
            if (!isset($data['code'])) {
                break;
            }

            /* 返回跳转到验证页面的链接 */
            if ($data['code'] == 200) {
                $token = Helpers::makeToken($mobile);
                $data['data'] = Helpers::url('/passport/reg/code', array('token' => $token, 'phoneNum' => $mobile, 'areaCode' => $area));
            }
        } while (false);

        $this->echoJson($data);
    }

    /**
     * 验证注册的识别码
     * 
     * @param string areaCode 地区编号,注意不需要+号
     * @param string phoneNum 手机号
     * @param string token 访问TOKEN凭证
     * @param int code 验证码, 手机上收到的
     * @return json
     */
    public function verifycodeAction()
    {
        $data = array('code' => 400, 'message' => '验证码错误', 'data' => '');

        do {
            /* 判断是不是AJAX请求 */
            if (!$this->isAjax()) {
                break;
            }

            $mobile = $this->post('phoneNum');
            $area = $this->post('areaCode');
            $code = $this->post('code');
            /* 判断参数是否合法 */
            if (!is_numeric($mobile) || !is_numeric($area) || !isset($code)) {
                break;
            }

            /* 设置注册有效时间30分钟, 防机器刷 */
            $expire = $this->getSession('_REG_EXPIRE');
            if (empty($expire) || $expire < time()) {
                break;
            }

            /* 验证注册的标识码是否有效 */
            $data = RegData::validMobileCode($area, $mobile, $code);
            if (!isset($data['code'])) {
                break;
            }

            /* 返回跳转到设置密码的链接 */
            if ($data['code'] == 200) {
                $token = Helpers::makeToken($mobile);
                $data['data'] = Helpers::url('/passport/reg/password', array('token' => $token, 'phoneNum' => $mobile, 'areaCode' => $area));
            } else if ($data['code'] == 404) {
                $data['message'] = '验证码错误'; //统一验证提示
            }
        } while (false);

        $this->echoJson($data);
    }

    /**
     * 发送验证码
     * 
     * @param string areaCode 地区编号,注意不需要+号
     * @param string phoneNum 手机号
     * @return json
     */
    public function sendcodeAction()
    {
        $data = array('code' => 400, 'message' => '发送验证码失败', 'data' => '');

        do {
            /* 判断是不是AJAX请求 */
            if (!$this->isAjax()) {
                break;
            }

            $mobile = $this->post('phoneNum');
            $area = $this->post('areaCode', '86');
            /* 判断参数是否合法 */
            if (!is_numeric($mobile) || !is_numeric($area)) {
                break;
            }

            /* 设置注册有效时间30分钟, 防机器刷 */
            $expire = $this->getSession('_REG_EXPIRE');
            if (empty($expire) || $expire < time()) {
                break;
            }

            /* 向手机发送注册验证码 */
            $data = RegData::sendCodeToMobile($area, $mobile);
            if (!isset($data['code'])) {
                break;
            }
        } while (false);

        $this->echoJson($data);
    }

    /**
     * 设置密码
     * 
     * @param string areaCode 地区编号,注意不需要+号
     * @param string phoneNum 手机号
     * @param string token 访问TOKEN凭证
     * @param string password 用户设置的密码
     * @return json
     */
    public function setpasswordAction()
    {
        $data = array('code' => 400, 'message' => '密码格式不正确', 'data' => '');

        do {
            /* 判断是不是AJAX请求 */
            if (!$this->isAjax()) {
                break;
            }

            $token = $this->post('token');
            $mobile = $this->post('phoneNum');
            $area = $this->post('areaCode');
            $password = $this->post('password');
            /* 判断参数是否合法 */
            if (!is_string($token) || !is_numeric($mobile) || !is_numeric($area) || !isset($password)) {
                break;
            }

            /* 判断是否允许访问 */
            if (!Helpers::verifyToken($mobile, $token)) {
                break;
            }

            /* 判断密码是否符合规则 */
            if (!Helpers::verifyPassword($password)) {
                break;
            }

            /* 验证注册的标识码是否有效 */
            $data = RegData::regMobile($area, $mobile, $password);
            if (!isset($data['code']) || $data['code'] != 200) {
                break;
            }

            /* 返回跳转到来源页面 */
            $refer = $this->getCookie('refer');
            if (empty($refer)) {
                $refer = SITE_MAIN . '/?go=1';
            } else {
                $refer = rawurldecode($refer);
            }
            $data['data']['session'] = Helpers::syncUserSession($data['data']['uid']);
            $data['data']['href'] = $refer;

            $token = Helpers::makeToken($data['data']['uid']);
            $this->setCookie('_TOKEN', $token);
            $this->setSession('_TOKEN', $token);
            $this->setSession('_LOGIN_UID', $data['data']['uid']);
        } while (false);

        $this->echoJson($data);
    }

}