<?php
declare(strict_types=1);
namespace App\Controller;
use \Phper666\JWTAuth\JWT;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Annotation\AutoController;
use Hyperf\Validation\Contract\ValidatorFactoryInterface;
use App\Tools\Result;
use App\JsonRpc\UserServiceInterface;
use App\Tools\CommonService;
use function Hyperf\Support\env;
use App\Tools\PublicData;
use Hyperf\Context\Context;
/**
 * @AutoController()
 */
class LoginController extends AbstractController
{

    #[Inject]
    protected ValidatorFactoryInterface $validationFactory;

    /**
     * @var UserServiceInterface
     */
    #[Inject]
    private $userServiceClient;
    public function login(Jwt $jwt)
    {
        $reqData =  $this->request->all();
        $validator = $this->validationFactory->make(
            $reqData,
            [
                'username' => 'required',
                'password' => 'required',
                'type'     =>'required'
            ],
            [
                'username.required' => '用户名不能为空',
                'password.required' => '密码不能为空',
                'type.required'     => '登录方式必填'
            ]
        );

        if ($validator->fails()){
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $comm = new CommonService();
        $ip = $comm->userIp();
        $redis = $this->container->get(\Hyperf\Redis\Redis::class);
        $code = $redis->get('code'.$ip);
        if(empty($code)){
            return Result::error("验证码已过期");
        }
        var_dump("验证码:",$code);
        if(strtolower($code)!=$reqData['captcha']){
            return Result::error("验证码错误");
        }
        $where = [];
        if($reqData['type'] ==1){//密码登录
            $where = [
                'user_name'=>$reqData['username'],
            ];
        }
//        $this->logger->info("验证之前");
        $userInfos = $this->userServiceClient->verifyUserInfo($where);
        if($userInfos['code']==0){
            return Result::error("用户名或密码错误");
        }
        var_dump("用户信息:",$userInfos);
//        $this->logger->info("验证用户返回值:", $userInfos);
        if(md5(md5($reqData['password']).$userInfos['data']['salt']) != $userInfos['data']['password']){
            return Result::error("用户名或密码错误");
        }
        $userData = [
            'uid' => $userInfos['data']['id'], // 如果使用单点登录,必须存在配置文件中的sso_key的值,一般设置为用户的id
            'user_name' => $userInfos['data']['user_name'],
            'mobile' => $userInfos['data']['mobile'],
            'email' => $userInfos['data']['email'],
//            'rong_token' => $userInfos['data']['rong_token'],
            'level_id' => $userInfos['data']['level_id'],
            'type_id' => $userInfos['data']['type_id'],
        ];
        var_dump($userData);
        // 使用默认场景登录
        $token = $jwt->getToken('default', $userData);
        $data = [
            'token' => $token->toString(),
            'exp' => $jwt->getTTL($token->toString()),
        ];
        return Result::success($data);
    }

    /**
     * @return void
     */
    public function checkVerifyCode(Jwt $jwt)
    {
        //其它信息暂时不管 先以openid
        $reqData =  $this->request->all();
        $validator = $this->validationFactory->make(
            $reqData,
            [
                'token' => 'required'
            ],
            [
                'token.required' => 'token不能为空'
            ]
        );
        if ($validator->fails()){
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $userInfo = $jwt->getClaimsByToken($reqData['token']);
        if($userInfo){
            return Result::success(['token'=>$reqData['token']]);
        }else{
            return Result::error("token无效");
        }
    }
    /**
     * 注册或登陆
     * @return void
     */
    public function registerOrLogin(Jwt $jwt)
    {
        //获取access_token
        $reqData =  $this->request->all();
        $validator = $this->validationFactory->make(
            $reqData,
            [
                'code' => 'required'
            ],
            [
                'code.required' => 'code不能为空'
            ]
        );

        if ($validator->fails()){
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }

        $url = env("WECHAT")."cgi-bin/token?appid=".env("APPID")."&secret=".env("APP_SECRET")."&grant_type=client_credential";
        $result =  PublicData::http_get($url);
        $accessTokenData = json_decode($result,true);
        //获取openid
        $url = env("WECHAT")."sns/jscode2session?appid=".env("APPID")."&secret=".env("APP_SECRET")."&js_code=".$reqData['loginCode']."&grant_type=authorization_code";
        $result =  PublicData::http_get($url);
        $openInfoData = json_decode($result,true);
        if(isset($openInfoData['errcode']) && in_array($openInfoData['errcode'],[40163,40029])){
            return  Result::error($openInfoData['errmsg']);
        }
        $data = [
            'code' => $reqData['code'],
            'openid'=>$openInfoData['openid']
        ];
        // 将数组转换为JSON字符串
        $jsonData = json_encode($data);
        // 初始化cURL会话
        $ch = curl_init(env("WECHAT")."wxa/business/getuserphonenumber?access_token=".$accessTokenData['access_token']);

        // 设置cURL选项 Todo 这里有一万个wc 封装成post方法就报错,后期再研究
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
            'Content-Length: ' . strlen($jsonData)
        ]);
        // 执行cURL会话
        $response = curl_exec($ch);
        // 检查是否有错误发生
        if(curl_errno($ch)){
            return  Result::error("获取手机号失败");
        }
        // 关闭cURL会话
        curl_close($ch);
        $response = json_decode($response,true);
        if($response['errcode']=='40029'){
            return  Result::error($openInfoData['errmsg']);
        }
       // 打印响应内容
        var_dump($openInfoData,$response);
        //根据openid 获取token

        $checkUserInfo = $this->userServiceClient->verifyUserInfo([
            'user_name'=>$response['phone_info']['purePhoneNumber']
        ]);
        if($checkUserInfo['code']==0){
            $salt = rand(1, 999999);
            $createUserData = [
                'user_name'=>$response['phone_info']['purePhoneNumber'],
                'salt' => $salt,
                'password'=>$openInfoData['openid'],
                'type_id'=>20000
            ];
            $checkUserInfo =  $this->userServiceClient->createUser($createUserData);
        }
        //根据openid和手机号判断是否注册,未注册直接注册
        $wechatReqData = [
            'openid'=>$openInfoData['openid'],
            'purePhoneNumber'=>$response['phone_info']['purePhoneNumber']
        ];
        $wechatInfo = $this->userServiceClient->getWechatInfo($wechatReqData);
        if($wechatInfo['code']==0){
            $wechatData = [
                'openid'=>$openInfoData['openid'],
                'phoneNumber'=>$response['phone_info']['phoneNumber'],
                'purePhoneNumber'=>$response['phone_info']['purePhoneNumber'],
                'countryCode'=>$response['phone_info']['countryCode'],
                'watermark'=>json_encode($response['phone_info']['watermark']),
                'user_id'=>$checkUserInfo['data']['id']
            ];
            $this->userServiceClient->addWechatInfo($wechatData);
        }
        var_dump($checkUserInfo);
        $userData = [
            'uid' => $checkUserInfo['data']['id'], // 如果使用单点登录,必须存在配置文件中的sso_key的值,一般设置为用户的id
            'user_name' => $response['phone_info']['phoneNumber'],
            'mobile' => $checkUserInfo['data']['mobile']??'',
            'email' => $checkUserInfo['data']['email'],
//            'rong_token' => $userInfos['data']['rong_token'],
            'level_id' => $checkUserInfo['data']['level_id'],
            'type_id' => $checkUserInfo['data']['type_id'],
        ];
        // 使用默认场景登录
        $token = $jwt->getToken('default', $userData);
        $data = [
            'token' => $token->toString(),
            'exp' => $jwt->getTTL($token->toString()),
        ];
        return Result::success($data);

    }

    public function httpPost()
    {

    }
    # http头部必须携带token才能访问的路由
    public function getData(Jwt $jwt)
    {
//        var_dump($this->UserId);
        $h = $this->request->getHeaders();
//        var_dump($this->request->getHeaders());
//        $a= 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwaHBlcjY2Ni9qd3QiLCJ1aWQiOjMyLCJ1c2VyX25hbWUiOiIxIiwicm9sZV9pZCI6MSwibW9iaWxlIjoiMTU4MDEyNDU3NTUiLCJlbWFpbCI6IjVAcXEuY29tIiwicm9uZ190b2tlbiI6IiIsImxldmVsX2lkIjo4LCJqd3Rfc2NlbmUiOiJkZWZhdWx0IiwianRpIjoiZGVmYXVsdF82Njc1MjJkZDQ3YWYxMi41MTE5MjI5MiIsImlhdCI6MTcxODk1MjY2OSwibmJmIjoxNzE4OTUyNjY5LCJleHAiOjE3MjE1NDQ2Njl9.e0JW8fgNrwBdFgmQ8GNtES2ME1SbcbIih5MsQWzT6sk';
        $arr =  $jwt->getClaimsByToken($h['token'][0]);
        var_dump($h['token'][0],"+++++++++++",$arr,"===####");
        return $this->response->json(['code' => 0, 'msg' => 'success', 'data' => ['a' => 1]]);
    }
}