<?php
/**
 * 登录注册
 * Author: xiaojie
 * DateTime: 2018/11/26 13:50
 */
namespace app\portal\controller;

use app\portal\model\CityCategoryModel;
use app\portal\model\UserModel;
use app\portal\validate\UsersValidate;
use cmf\controller\HomeBaseController;
use app\portal\model\CollectionModel;
use cmf\lib\Storage;
use think\Db;
use anerg\OAuth2\OAuth;
use think\Config;
use app\portal\model\PortalPostModel;

class LoginController extends HomeBaseController
{
    private $limit = 8;//收藏,搜索分页
    private $appkey = 737607150;//微博appkey
    private $appsecret = 'd80b43a1e74e8ba095590b36a3459480';//微博appsecret
    private $redirect_uri = 'http://www.starplanet.cn/portal/login/wb_login';//回调地址

    private $appkey1 = 'wx9cfa880272f186bf';//微信开放平台appkey
    private $appsecret1 = '11b643393b1e54d6ef5eaa984ba4e545';//微信开放平台appsecret

    private $appkey2 = 'wx0bd7bc2aa0f332d6';//微信公众号appkey
    private $appsecret2 = 'b62e49f48f48de7b7fff2ea0af3939de';//微信公众号appsecret
    //登录页面
    public function login(){
        return $this->fetch();
    }

    //登录提交
    public function loginCommit(){
        //提交参数手机号(mobile),密码(user_pass)
        $param = $this->request->param();
        $validate = new UsersValidate();
        $userModel = new UserModel();
        $map = [
            'mobile' => $param['mobile'],
            'user_pass' => cmf_password($param['user_pass']),
            'user_type' => 2,
            'user_status' => 1,
        ];
        $userInfo = $userModel->where($map)->find();
        if(!$userInfo){
            $this->apiResponse(0,'账号或密码错误');
        }
        $ip = get_client_ip();
        $data = [
            'id' => $userInfo['id'],
            'last_login_time' => time(),
            'last_login_ip' => $ip,
        ];

        if(!$validate->scene('edit')->check($data)){
            $this->apiResponse(0,$validate->getError());
        }
        $res = $userModel->isUpdate(true)->save($data);
        if($res){
            //用户信息存入session
            cmf_update_current_user($userInfo);
            $this->apiResponse(1,'登录成功');
        }
        $this->apiResponse(0,'未知错误');
    }

    //第三方登录页面
    public function thirdLogin(){
        return $this->fetch();
    }

    //注册页面
    public function register(){
        return $this->fetch();
    }

   //注册提交
    public function registerCommit(){
        //提交参数手机号(mobile),验证码(mobile_code),密码(user_pass)
        $param = $this->request->param();
        //验证验证码是否正确
        $common = new CommonController();
        $common->validateMobileCode($param);
        //验证场景add
        $validate = new UsersValidate();
        if(!$validate->scene('add')->check($param)){
            $this->apiResponse(0,$validate->getError());
        }
        if(empty($param['user_pass'])){
            $this->apiResponse(0,'密码不能为空!');
        }
        //是否已注册
        $userModel = new UserModel();
        $userInfo = $userModel->where(['mobile'=>$param['mobile'],'user_type'=>2])->find();
        if($userInfo){
            $this->apiResponse(0,'此账号已被注册');
        }
        //新增注册信息
        $info['mobile'] = $param['mobile'];
        $info['user_pass'] = cmf_password($param['user_pass']);
        $info['user_type'] = 2;
        $info['source'] = '本站';
        $info['create_time'] = time();
        $res = $userModel->allowField(true)->save($info);
        if($res){
            $this->apiResponse(1,'注册成功');
        }
        $this->apiResponse(0,'未知错误');
    }

    //首页个人中心
    public function info(){
        $login = cmf_is_user_login();
        if($login) {
            return $this->fetch();
        }
    }

    //退出登录
    public function logout(){
        cmf_update_current_user(NULL);
        $this->apiResponse(1,'退出成功!');
    }

    //首页个人中心修改头像
    public function updateAvatar(){
        //判断是否登录
        $login = cmf_is_user_login();
        if($login){
            $file   = $this->request->file('avatar');
            if (empty($file)) {
                $this->apiResponse(0,'未检测出文件!');
            }
            $result = $file->validate([
                'ext'  => 'jpg,jpeg,png',
                'size' => 1024 * 1024
            ])->move(WEB_ROOT . 'upload' . DIRECTORY_SEPARATOR . 'avatar' . DIRECTORY_SEPARATOR);

            if ($result) {
                $avatarSaveName = str_replace('//', '/', str_replace('\\', '/', $result->getSaveName()));
                $avatar         = 'avatar/' . $avatarSaveName;
                $avatarPath = WEB_ROOT . "upload/" . $avatar;

                $storage = new Storage();
                $storage->upload($avatar, $avatarPath, 'image');
                $id = cmf_get_current_user_id();

                $userModel = new UserModel();
                $res = $userModel->allowField(true)->update(['id'=>$id,'avatar'=>$avatar]);
                if($res){
                    $userInfo = $userModel->where('id',$id)->find();
                    cmf_update_current_user($userInfo);
                    $this->apiResponse(1,'上传成功!');
                }else{
                    $this->apiResponse(0,'上传失败!');
                }
            } else {
                $this->apiResponse(0,$file->getError());
            }
        }else{
            $this->apiResponse(0,'请登录后修改头像!');
        }
    }

    //个人中心编辑页面
    public function editInfo(){
        $login = cmf_is_user_login();
        if($login) {
            return $this->fetch();
        }
    }

    //个人中心编辑提交
    public function updateNickname(){
        //判断是否登录
        $login = cmf_is_user_login();
        $nickname = $this->request->param('nickname');
        if($login){
            $userModel = new UserModel();
            $id = cmf_get_current_user_id();
            if(empty($nickname)){
                $this->apiResponse(0,'昵称不能为空!');
            }
            $res = $userModel->allowField(true)->update(['id'=>$id,'user_nickname'=>$nickname]);
            if($res){
                $userInfo = $userModel->where('id',$id)->find();
                cmf_update_current_user($userInfo);
                $this->apiResponse(1,'保存成功!');
            }else{
                $this->apiResponse(0,'保存失败!');
            }
        }else{
            $this->apiResponse(0,'请登录后修改资料!');
        }
    }

    //我的收藏列表
    public function myCollection(){
        $login = cmf_is_user_login();
        if($login) {
            $limit = $this->limit;
            $uid = cmf_get_current_user_id();
//        $collectionModel = new CollectionModel();
//        $res = $collectionModel
//            ->where(['uid'=>$uid])
//            ->field('id,post_id,category_name,city_name,post_url')
//            ->order('id desc')
//            ->paginate($limit);
            $res = Db::name('collection')
                ->alias('c')
                ->join('portal_post p','c.post_id = p.id')
                ->where(['c.uid'=>$uid,'p.delete_time'=>0])
                ->field('c.id,c.category_name,c.city_name,c.post_url,p.post_title,p.post_excerpt,p.post_favorites')
                ->order('c.id desc')
                ->paginate($limit);
            $data = $res->toArray();
            $page = $res->render();
//        $post_ids = array_unique(array_column($data['data'],'post_id'));
//        $data1 = Db::name('portal_post')
//            ->whereIn('id',$post_ids)
//            ->where('delete_time', 0)
//            ->field('id,post_title,post_excerpt,post_favorites')
//            ->order('weigh desc')
//            ->select()
//            ->toArray();
//        foreach($data['data'] as &$value){
//            $value['post_title'] = '';
//            $value['post_excerpt'] = '';
//            $value['post_favorites'] = '';
//            foreach ($data1 as $item) {
//                if($value['post_id'] == $item['id']){
//                    $value['post_title'] = $item['post_title'];
//                    $value['post_excerpt'] = $item['post_excerpt'];
//                    $value['post_favorites'] = $item['post_favorites'];
//                }
//            }
//        }
            $this->assign('res',$data['data']);
            $this->assign('page',$page);
            return $this->fetch();
        }
    }

    //搜索列表
    public function searchList(){
        $keyword = $this->request->param('keyword');
        if(isset($keyword) && !empty($keyword)){
            $limit = $this->limit;
            $res = Db::name('portal_post')
                ->alias('p')
                ->join('city_category c','p.city_id = c.id','LEFT')
                ->join('portal_category_post c_p','p.id = c_p.post_id','LEFT')
                ->where('p.post_title','like','%'.$keyword.'%')
                ->where('c_p.category_id','<>',CityCategoryModel::xyhl)
                ->where('p.delete_time', 0)
                ->field('p.id,p.post_title,p.post_excerpt,p.post_favorites,c.name city_name,c.id city_id')
                ->order('p.weigh desc')
                ->paginate($limit,false,['query'=>request()->param()]);
            $data = $res->toArray();
            $page = $res->render();

            $post_ids = array_column($data['data'],'id');
            //查找分类名称
            $category = Db::name('portal_category_post')
                ->alias('c_p')
                ->join('portal_category c','c_p.category_id = c.id','LEFT')
                ->whereIn('c_p.post_id',$post_ids)
                ->field('c.id,c_p.post_id,c.name')
                ->select()
                ->toArray();
            foreach($data['data'] as &$value){
                $value['post_title'] = str_replace($keyword,'<span style="color:rgba(9, 255, 142, 1);">'.$keyword.'</span>',$value['post_title']);
                foreach($category as $item){
                    if($value['id'] == $item['post_id']){
                        $value['category_name'] = $item['name'];
                        $value['post_url'] = $this->getDetailUrl($item['id'],$value['city_id']);
                    }
                }
            }

            //查询总数
            $count = Db::name('portal_post')
                ->alias('p')
                ->join('portal_category_post c_p','p.id = c_p.post_id','LEFT')
                ->where('p.post_title','like','%'.$keyword.'%')
                ->where('c_p.category_id','<>',CityCategoryModel::xyhl)
                ->where('p.delete_time', 0)
                ->count();
        }else{
            $count = 0;
            $data['data'] = [];
            $page = '';
        }
        $this->assign('count',$count);
        $this->assign('res',$data['data']);
        $this->assign('page',$page);
        return $this->fetch();
    }

    //获取各个板块详情页位置
    public function getDetailUrl($c_id,$city_id){
        $url = '';
        switch ($c_id) {
            case CityCategoryModel::xqgs:
                $url = '/portal/star/getStoryDetail';
                break;
            case CityCategoryModel::xqyy:
                $url = '/portal/region/getMoreVideo?city_id='.$city_id;
                break;
            case CityCategoryModel::whmj:
                $url = '/portal/star/getSceneryDetail';
                break;
            case CityCategoryModel::yyzx:
                $url = '/portal/star/getFoodDetail';
                break;
            case CityCategoryModel::lsmq:
                $url = '/portal/star/getHotelDetail';
                break;
            case CityCategoryModel::hlst:
                $url = '/portal/star/getEcologyDetail';
                break;
            case CityCategoryModel::blcx:
                $url = '/portal/star/getTravelDetail';
                break;
            case CityCategoryModel::mxft:
                $url = '/portal/region/getStarDetail';
                break;
            case CityCategoryModel::djkb:
                $url = '/portal/region/getNewsDetail';
                break;
            case CityCategoryModel::djrz:
                $url = '/portal/region/getNoteDetail';
                break;
            case CityCategoryModel::tqwl:
                $url = '/portal/region/getFutureDetail';
                break;
            case CityCategoryModel::qlxc:
                $url = '/portal/enjoy/getEnjoyDetail';
                break;
            case CityCategoryModel::sjmy:
                $url = '/portal/enjoy/getEnjoyDetail';
                break;
            case CityCategoryModel::stsy:
                $url = '/portal/enjoy/getEnjoyDetail';
                break;
            case CityCategoryModel::hwtt:
                $url = '/portal/enjoy/getEnjoyDetail';
                break;
            case CityCategoryModel::lylx:
                $url = '/portal/scout/getTravelDetail';
                break;
            case CityCategoryModel::ddfw:
                $url = '/portal/scout/getSceneryDetail';
                break;
            case CityCategoryModel::cysj:
                $url = '/portal/scout/getSceneryDetail';
                break;
            case CityCategoryModel::yjyr:
                $url = '/portal/scout/getSceneryDetail';
                break;
            default:
        }
        return $url;
    }

    //第三方微信pc登录
    public function wx_login(){
        $code = $this->request->get('code');
        $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$this->appkey1.'&secret='.$this->appsecret1.'&code='.$code.'&grant_type=authorization_code';
        $res = $this->http_get($url);
        $json_arr = json_decode($res,true);

        if(!isset($json_arr['access_token'])&&empty($json_arr['access_token'])){
            //用户取消登录
            $this->redirect('/portal/login/thirdLogin');
        }
        $token = $json_arr['access_token'];
        $openid = $json_arr['openid'];
        //通过access_token获取用户信息
        $url1 = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$token.'&openid='.$openid;
        $res1 = $this->http_get($url1);
        $info = json_decode($res1,true);
        //查询该微信用户是否存在
        $where = ['wb_id'=>$info['openid'],'source'=>'微信'];
        $user = $this->findThird($where);
        //获取微博id,昵称,头像
        $userModel = new UserModel();
        $ip = get_client_ip();
        $users['last_login_time'] = time();
        $users['last_login_ip'] = $ip;
        if($user){
            $users['user_nickname'] = $info['nickname'];
            $users['avatar'] = $info['headimgurl'];
            $userModel->where(['wb_id'=>$info['openid'],'source'=>'微信'])->update($users);
        }else{
            $users['wb_id'] = $info['openid'];
            $users['user_nickname'] = $info['nickname'];
            $users['avatar'] = $info['headimgurl'];
            $users['source'] = '微信';
            $users['user_type'] = 2;
            $users['create_time'] = time();
            $userModel->create($users);
        }
        $userInfo = $this->findThird($where);
        cmf_update_current_user($userInfo);
        $this->redirect('/');
    }

    //第三方微信移动端网页登录
    public function wx_login_mobile(){
        $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->appkey2.'&secret='.$this->appsecret2;
        $res = $this->http_get($url);
        $json_arr = json_decode($res,true);
        if(!isset($json_arr['access_token'])&&empty($json_arr['access_token'])){
            //用户取消登录
            $this->redirect('/portal/login/thirdLogin');
        }
        $token = $json_arr['access_token'];
        $openid = 'oYOYl5hbULoKimG5R8Uk-Paha0d8';
        //通过access_token获取用户信息
        $url1 = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token='.$token.'&openid='.$openid.'&lang=zh_CN';
        $res1 = $this->http_get($url1);
        $info = json_decode($res1,true);
        var_dump($info);exit;
    }

    //第三方微博登录
    public function wb_login(){
        $code = $this->request->get('code');
        $url = 'https://api.weibo.com/oauth2/access_token';
        //要传的数据
        $data = [
            'client_id' => $this->appkey,
            'client_secret'=>$this->appsecret,
            'grant_type'=>'authorization_code',
            'code'=>$code,
            'redirect_uri'=>$this->redirect_uri  //回调地址
        ];
        $res = $this->http_post($url,$data);
        $json_arr = json_decode($res,true);
        //获取access_token
        if(isset($json_arr['error_code'])&&!empty($json_arr['error_code'])){
            //用户取消登录
            $this->redirect('/portal/login/thirdLogin');
        }
        $token = $json_arr['access_token'];
        //存token到session
        session('token', $token);
        $uid = $json_arr['uid'];
        //发送get请求,获取登陆用户的信息
        $info = $this->http_get('https://api.weibo.com/2/users/show.json?access_token='.$token.'&uid='.$uid);
        $info = json_decode($info,true);

        //查询该微博用户是否存在
        $where = ['wb_id'=>$info['id'],'source'=>'微博'];
        $user = $this->findThird($where);
        //获取微博id,昵称,头像
        $userModel = new UserModel();
        $ip = get_client_ip();
        $users['last_login_time'] = time();
        $users['last_login_ip'] = $ip;
        if($user){
            $users['user_nickname'] = $info['screen_name'];
            $users['avatar'] = $info['profile_image_url'];
            $userModel->where(['wb_id'=>$info['id'],'source'=>'微博'])->update($users);
        }else{
            $users['wb_id'] = $info['id'];
            $users['user_nickname'] = $info['screen_name'];
            $users['avatar'] = $info['profile_image_url'];
            $users['source'] = '微博';
            $users['user_type'] = 2;
            $users['create_time'] = time();
            $userModel->create($users);
        }
        $userInfo = $this->findThird($where);
        cmf_update_current_user($userInfo);
        $this->redirect('/');
    }

    //微博分享
    public function wb_share(){
        $login = cmf_is_user_login();
        if($login) {
            $token = session('token');
            $title = $this->request->post('title');//分享标题
            $share_url = $this->request->post('share_url');//分享url
            $article_id = $this->request->post('id');//分享文章id
            $url = 'https://api.weibo.com/2/statuses/share.json';
            $data = [
                'access_token' => $token,
                'status' => $title . "  " . $share_url
            ];
            $res = $this->http_post($url, $data);
            $json_arr = json_decode($res, true);
            if (isset($json_arr['error_code']) && !empty($json_arr['error_code'])) {
                $this->apiResponse(0, $json_arr['error']);
            }
            $postModel = new PortalPostModel();
            $postModel->where('id', $article_id)->setInc('post_share_wb', 1);
            $this->apiResponse(1, '分享成功!');
        }else{
            $this->apiResponse(0, '请使用微博登录后操作!');
        }
    }

    //取消授权
    public function wb_cancel(){
        $this->redirect('/');
    }

    //查询第三方用户是否存在
    public function findThird($where){
        $info = Db::name('user')
            ->where($where)
            ->find();
        return $info;
    }

    //获取微信分享配置信息
    public function wxShare($url=''){
        $jsapiTicket = $this->getSignature();
        // 注意 URL 一定要动态获取,不能 hardcode.
        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
        if($url === '') {
            $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
        }
        $timestamp = time();
        $nonceStr = $this->createNonceStr();
        $string = 'jsapi_ticket='.$jsapiTicket.'&noncestr='.$nonceStr.'&timestamp='.$timestamp.'&url='.$url;
        $signature = sha1($string);
        $data = [
            "appId"     => $this->appkey2,
            "nonceStr"  => $nonceStr,
            "timestamp" => $timestamp,
            "url"       => $url,
            "signature" => $signature,
            "rawString" => $string
        ];
        $this->assign('data',$data);
        return $this->fetch('./public/share');
    }

    //获取微信分享签名随机字符串
    public function createNonceStr($length = 16) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }

    //获取access_token
    public function getWxAccessToken(){
        $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->appkey2.'&secret='.$this->appsecret2;
        $res = $this->http_get($url);
        $json_arr = json_decode($res,true);
        $token = $json_arr['access_token'];
        return $token;
    }

    //获取微信分享签名
    public function getSignature(){
        if(isset($_SESSION['ticket_expire_time']) && $_SESSION['ticket_expire_time'] > time() && $_SESSION['ticket']){
            $ticket = $_SESSION['ticket'];
        }else{
            $token = $this->getWxAccessToken();
            $url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$token.'&type=jsapi';
            $res = $this->http_get($url);
            $json_arr = json_decode($res,true);
            $ticket = $json_arr['ticket'];
            $_SESSION['ticket'] = $ticket;
            $_SESSION['ticket_expire_time'] = time()+7000;
        }
        return $ticket;
    }

    //curl  get请求
    public function http_get($url){
        $curl = curl_init();//启动一个CURL会话
        curl_setopt($curl, CURLOPT_URL,$url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
        curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
        curl_setopt($curl, CURLOPT_HEADER, false);//不开启header
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 获取的信息以文件流的形式返回
        $result = curl_exec($curl); //执行操作
        curl_close($curl);
        return $result;
    }

    //curl post请求
    public function http_post($url,$data){
        $curl = curl_init();//启动一个CURL会话
        curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
        curl_setopt($curl, CURLOPT_POST, true); // 发送一个常规的Post请求
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); // Post提交的数据包
        curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
        curl_setopt($curl, CURLOPT_HEADER, false); // 开启header
        //curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);//请求头部
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 获取的信息以文件流的形式返回
        $result = curl_exec($curl); //执行操作
        curl_close($curl);
        return $result;
    }
}