<?php

namespace App\Http\Service;

use App\Http\Manager\SdkManager;
use App\Models\ChannelConfig;
use App\Models\GameConfig;
use App\Utils\CommonFunc;
use Exception;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
use RuntimeException;

class LoginService
{
    // 游戏配置
    private $gameConfig;
    // 渠道配置
    private $channelConfig;

    public function __construct()
    {
        $this->gameConfig = new GameConfig();
        $this->channelConfig = new ChannelConfig();
    }

    /**
     * 登录sdk并返回一个token
     * @param array $params
     * @return array[]
     */
    public function createToken(array $params): array
    {
        $sdkManager = new SdkManager();
        //获取游戏表配置
        $gameInfo = DB::table("app_games_config")
            ->where(['app_id' => $params['app_id']])->first();
        if (is_null($gameInfo)) {
            return error('该游戏配置不存在,app_id:' . $params['app_id']);
        }
        // 获取渠道表配置
        $verInfo = DB::table("app_ver_game as avg")
            ->leftJoin('app_ver as av', 'avg.ver', '=', 'av.ver_class')
            ->where(['app_id' => $params['app_id'], 'ver_code' => $params['ctype']])->first();
        if (is_null($verInfo)) {
            return error('该游戏渠道没配置,app_id:' . $params['app_id']);
        }
        //登录成功则返回userinfo
        $loginInfo = $sdkManager->login($verInfo, $gameInfo, $params);
        if (!$loginInfo) {
            return error('渠道登录失败!');
        }
        // 判断用户是否存在,appid为CP的appid
        $userInfo = DB::table('app_member')->where(['app_id' => $params['app_id'], 'uname' => $loginInfo['uname']])->first();
        if (is_null($userInfo)) {
            //保存聚合用户的信息并返回token
            $uid = DB::table('app_member')->insertGetId([
                'uname' => $loginInfo['uname'],
                'veruniqid' => $loginInfo['ver_user_id'],
                'app_id' => $params['app_id'],
                'ver' => $params['ctype'] ?? '',
                'reg_ip' => CommonFunc::getTrustedProxiesIp(),
                'reg_time' => date('Y-m-d H:i:s'),
                'login_time' => date('Y-m-d H:i:s'),
                'login_ip' => CommonFunc::getTrustedProxiesIp(),
                'add_time' => date('Y-m-d H:i:s')
            ]);
        } else {
            // 更新登录信息
            DB::table('app_member')->where(['uname' => $loginInfo['uname'], 'app_id' => $gameInfo->app_id])->update([
                'login_time' => date('Y-m-d H:i:s'),
                'login_ip' => CommonFunc::getTrustedProxiesIp()
            ]);
        }
        // 保存登录日志
        DB::table('app_memberloginlog')->insert([
            'uid' => $uid ?? $userInfo->uid,
            'uname' => $loginInfo['uname'],
            'reg_ver' => $params['ctype'] ?? '',
            'reg_time' => date('Y-m-d H:i:s'),
            'appid' => $params['app_id'],
            'login_ver' => $params['ctype'] ?? '',
            'login_time' => date('Y-m-d H:i:s'),
            'login_ip' => CommonFunc::getTrustedProxiesIp()
        ]);
        // 产生一个token ,存redis ,有效期5分钟
        $uid = $uid ?? $userInfo->uid;
        $value = $uid . '|' . $gameInfo->app_id . '|' . $gameInfo->appkey . '|' . time();
        $key = md5($value);
        Redis::setex($key, 60 * 60, $value);
        return success("第三方登录成功!", ['token' => $key, 'uid' => $uid]);
    }

    /**
     * 根据token获取用户信息
     * @param array $params
     * @return array
     */
    public function getTokenInfo(array $params): array
    {
        $tokenInfo = Redis::get($params['token']);
        if (!$tokenInfo) {
            return error('token已过期,请重新获取!');
        }
        list($uid, $app_id, $appkey, $login_time) = explode('|', $tokenInfo);
        // 签名 MD5(appid=appid&token=token&uid=uid&appkey=appkey)
        $mysign = md5('appid=' . $app_id . '&token=' . $params['token'] . '&uid=' . $uid . '&appkey=' . $appkey);
        if ($mysign !== $params['sign']) {
            return error("签名失败!");
        }
        // 查找用户信息,判断是否正常
        $userInfo = DB::table('app_member')->where(['uid' => $uid, 'app_id' => $app_id])->first();
        if (is_null($userInfo)) {
            return error('用户信息异常!');
        }
        return success('success', ['uid' => $uid]);
    }


}