<?php

namespace App\Jobs;

use App\Consts\SysConsts;
use App\Modules\OfficialAccount\Models\ForceSubscribeUsers;
use App\Modules\OfficialAccount\Models\OfficialAccount;
use App\Modules\Trade\Models\Order;
use App\Modules\User\Models\User;
use App\Modules\User\Models\UserEnv;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ConnectException;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\Log;

/**
 * 抖音用户推送数据
 */
class TikTokUser implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    /**
     * 类型:充值
     */
    const charge = 'charge';
    /**
     * 类型:注册
     */
    const register = 'register';

    private $uid;
    private $type;

    /**
     * Create a new job instance.
     * @param int $uid
     * @param string $type 类型
     * @return void
     */
    public function __construct(int $uid, string $type)
    {
        $this->uid = $uid;
        $this->type = $type;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $user = User::find($this->uid);
        $user_env = UserEnv::where('uid', $this->uid)->first();
        if ($user && $user_env) {
            if ($this->type == self::charge) {
                $order = Order::where('uid', $this->uid)->where('status', 'PAID')->orderBy('id', 'desc')->first();
                $current_day_register = date('Y-m-d', strtotime($order->created_at)) ==  date('Y-m-d', strtotime($user->created_at));
                if ($order && $current_day_register && $order->price >= 30) {
                    $time = (string) $order->created_at;
                    $ip = $order->create_ip;
                    $count = Order::where('uid', $this->uid)->where('status', 'PAID')->where('price', '>=', '30')->count();
                    if ($count == 1) {
                        $amount = $order->price;
                    } else {
                        return;
                    }
                } else {
                    return;
                }
            } else {
                $time = (string) $user->created_at;
                $ip = $user->register_ip;
            }
            $wechat = OfficialAccount::where('distribution_channel_id', $user->distribution_channel_id)->orderBy('id', 'desc')->first();
            if ($wechat) {
                $params = [
                    'ip' => trim($ip),
                    'ua' => trim($user_env->ua),
                    'open_id' => trim($user->openid),
                    'account_id' => trim($wechat->alias),
                    'app_id' => trim($wechat->appid),
                    'source' => 'wdy',
                    'amount' =>  isset($amount) ? $amount : '',
                    'type' => $this->type,
                    'time' => $time,
                ];
                $params['sign'] = _sign($params, SysConsts::TIKTOK_KEY);
                $client = new Client(['timeout' => 4]);
                $url = 'https://newtrackapi.zhuishuyun.com/api/tiktokPushInfo';
                try {
                    $response = $client->post($url, ['form_params' => $params]);
                    $code = $response->getStatusCode();
                    $res = $code == 200 ? 'success' : 'fail';
                    Log::info('TikTokUser .' . $this->type . '. result : ' . $res . ' request params :' . json_encode($params) . ' http code: ' . $response->getStatusCode() . ' return content:' . $response->getBody()->getContents());
                } catch (ConnectException $e) {
                    Log::error($e->getMessage());
                }
            }
        }
    }
}