<?php
/*
 * description：
 * author：wh
 * email：
 * createTime：{2024/4/3} {15:43} 
 */

namespace app\api\controller;


use app\api\logic\DouLogic;
use app\common\model\TabConf;
use think\Db;
use wanghua\general_utility_tools_php\douyin\DouYinMiniGame;
use wanghua\general_utility_tools_php\image\Image;
use wanghua\general_utility_tools_php\tool\Tools;

class Douyin extends BaseHttpApi
{

    public function __construct()
    {

        //$logic = new DouLogic();
        //$logic->realTimeGetAccessToken();

    }

    /**
     * desc：
     *
     * api/Douyin/getaccesstoken
     *
     * author：wh
     */
    function getaccesstoken(){

        $logic = new DouYinMiniGame();
        //tp5.1必须带app.
        $logic->appid = config('app.douyin_config_mini_game.appid');
        $logic->secret = config('app.douyin_config_mini_game.secret');
        $res = $logic->realTimeGetAccessToken();

        return json($res);
    }

    /**
     * desc：tt.login触发调用
     * 参数：code或anonymous_code
     *
     * api/Douyin/jscode2session
     *
     * "{\"anonymous_openid\":\"\",\"error\":0,\"openid\":\"_0007vGUSinv-twIOjY9MzYvzlj6U_xHa3Or\",\"session_key\":\"495rArUkMUXa4JoeT7wEVg==\",\"unionid\":\"7e1b9701-a346-5b44-9925-0acc40873cff\"}
     *
     * author：wh
     */
    function jscode2session(){

        //{"nickName":"fish","avatarUrl":"https://p26.douyinpic.com/aweme/100x100/f831000cb79d741e8c7e.jpeg?
        //from=3782654143",
        //"gender":0,"city":"","province":"","country":"","language":""}
        try {
            $clientid = input('clientid');
            if(empty($clientid)){
                return json(Tools::set_fail('clientid error'));
            }
            $json = input('json');
            $json_arr = json_decode($json, true);

            $logic = new DouYinMiniGame();
            //tp5.1必须带app.
            $logic->appid = config('app.douyin_config_mini_game.appid');
            $logic->secret = config('app.douyin_config_mini_game.secret');
            //tt.login 接口返回的匿名登录凭证（code 和 anonymous_code 至少要有一个）
            $code = input('code');
            $anonymous_code = input('anonymous_code');
            $res = $logic->jscode2session($code,$anonymous_code);

            //保存用户信息
            if($res['code'] != 200){
                return json($res);
            }
            $openid = $res['data']['openid'];
            $user = Db::table(TabConf::$fa_users)
                ->where('openid',$openid)
                ->find();
            if(empty($user)){
                $data = [
                    'openid'=>$openid,
                    'nickname'=>isset($json_arr['nickName'])?$json_arr['nickName']:'',
                    'headimage'=>isset($json_arr['avatarUrl'])?$json_arr['avatarUrl']:'',
                    'user_type'=>'douyin',
                    'unionid'=>$res['data']['unionid'],
                    'clientid'=>$clientid,
                    'last_login_time'=>Tools::get_now_date(),
                ];
                Db::table(TabConf::$fa_users)
                    ->data($data)
                    ->insert();
            }else{
                Db::table(TabConf::$fa_users)
                    ->where('openid',$openid)
                    ->data([
                        'clientid'=>$clientid,
                        'nickname'=>isset($json_arr['nickName'])?$json_arr['nickName']:Tools::rand_str(),
                        'headimage'=>isset($json_arr['avatarUrl'])?$json_arr['avatarUrl']:request()->domain().'/static/common/headimage.jpg',
                        'last_login_time'=>Tools::get_now_date(),
                    ])//更新登录状态
                    ->update();
            }

            //初始化用户消消乐游戏奖励
            $usereliminate = Db::table(TabConf::$fa_usereliminate)
                ->where('openid',$openid)
                ->find();
            if(empty($usereliminate)){
                Db::table(TabConf::$fa_usereliminate)->insert([
                    'openid'=>$openid
                ]);
            }
            return json($res);
        }catch (\Exception $e){
            Tools::error_txt_log($e);
            return json(Tools::set_fail());
        }
    }

    /**
     * desc：创建二维码
     * 接口说明
     *  获取小程序/小游戏的二维码。该二维码可通过任意 app 扫码打开，
     * 能跳转到开发者指定的对应字节系 app 内拉起小程序/小游戏，并传入开发者指定的参数。
     * 通过该接口生成的二维码，永久有效，暂无数量限制。
     *
     * ⚠ Tip：在使用该功能之前请记得先配置您的默认分享文案和图片，配置方式可参考论坛。
     * ⚠ Tip：小程序的 path 要 encode 一次，如 pages%3fparam%3dtrue，小游戏的 path 为 JSON 字符串，
     *    如{"param":true}，否则会导致取不到。
     *
     * 参数：
     * code和anonymous_code二选一 必须
     * appname 可选，目标打开应用名称 默认douyin
     * background 可选，背景色，rgb格式，英文逗号隔开，默认透明色
     * path 可选，小程序/小游戏启动参数，小程序则格式为 encode({path}?{query})，小游戏则格式为 JSON 字符串，默认为空
     * width 宽度 可选，二维码宽度，单位 px，最小 280px，最大 1280px，默认为 430px
     * line_color 可选，二维码线条颜色，默认为黑色，rgb格式，英文逗号隔开，默认黑色
     * set_icon 可选，是否展示小程序/小游戏 icon，默认不展示，传yes展示，no不展示，默认no
     *
     * api/douyin/createQRCode
     * 参数：openid
     *
     * author：wh
     */
    function createQRCode(){
        try {

            $openid = input('openid');
            if(empty($openid)){
                return json(Tools::set_fail('openid error'));
            }
            $logic = new DouYinMiniGame();
            //tp5.1必须带app.
            $logic->appid = config('app.douyin_config_mini_game.appid');
            $logic->secret = config('app.douyin_config_mini_game.secret');
            $path=input('path','');
            $appname=input('appname','douyin');
            $width=input('width');
            $background=input('background');
            $line_color=input('line_color');
            $set_icon=input('set_icon','yes');
            $res = $logic->createQRCode($path,$appname,$width,$background,$line_color,$set_icon);


            if(is_array($res)){
                return json(Tools::set_fail('错误.',$res));
            }
            $img_save_path = '/uploads/unlimited_douyin/';
            $rand_str = Tools::rand_str();
            $filename = $openid.'_'.$rand_str.'.png';
            (new Image())->binaryToImage($res,$img_save_path,$filename);
            return json(Tools::set_ok('ok',$img_save_path.$filename));
        }catch (\Exception $e){
            Tools::error_txt_log($e);
            return json(Tools::set_fail());
        }
    }
}