<?php


namespace App\Services;


use App\dao\Estatisticas\RechargeWithDraw;
use App\Facade\TableName;
use App\Game\GlobalUserInfo;
use App\Game\Services\AgentService;
use App\Http\Controllers\Api\AgentController;
use App\Http\helper\Helper;
use App\Http\helper\HttpCurl;
use App\Http\helper\NumConfig;
use App\Jobs\AfEvent;
use App\Models\AgentUser;
use App\Models\RecordScoreInfo;
use App\Models\RecordUserDataStatistics;
use App\Util;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;

class  OrderServices
{
    public $FirstCharge = 30;
    public $FirstChargeGive = 20;

    public $FirstGiftID = 301;
    private $first_pay = null;

    public function __construct()
    {

    }

    /**
     * 获取支付金额
     * @param int $GiftsID 礼包ID
     * @param int $user_id 用户ID
     * @param int $payAmt 支付金额（元）
     * @return array|void [$give, $favorable_price, $Recharge, $czReason, $cjReason] 赠送金额，赠送金额+充值金额，充值金额，充值原因，彩金原因
     */
    public function getPayInfo($GiftsID, $user_id, $payAmt)
    {
        $give = $czReason = $cjReason = $Recharge = $favorable_price = $second_give = 0;

        // 判断是不是首冲礼包
        if (!empty($GiftsID)) {

            if ($GiftsID == 301) { // 礼包--首冲


                $Gifts = DB::connection('write')->table('agent.dbo.recharge_gift')->where('gift_id', $GiftsID)->first();
                $favorable_price = round($Gifts->bonus_instantly*$payAmt/100,2);
                $give = $favorable_price-$payAmt;
                $Recharge = $payAmt;
                $czReason = 50;
                $cjReason = 51;
            }else if ($GiftsID > 400) {
                $Status = 1;
                $recharge_gear = DB::connection('write')->table('agent.dbo.recharge_gear')->where('status', $Status)->where('money', $payAmt)->select('favorable_price', 'give')->first();
                if(!$recharge_gear){
                    $Recharge=$payAmt;
                    $give=0;
                }else{
                    $Recharge = $recharge_gear->favorable_price;
                    $give = $recharge_gear->give;
                }

                $favorable_price = $Recharge + $give;
                $czReason = 1;
                $cjReason = 45;
            }

        } else { // 普通订单

            $Status = 1;
            $recharge_gear = DB::connection('write')->table('agent.dbo.recharge_gear')->where('status', $Status)->where('money', $payAmt)->select('favorable_price', 'give')->first();
            if(!$recharge_gear){
                $Recharge=$payAmt;
                $give=0;
            }else{
                $Recharge = $recharge_gear->favorable_price;
                $give = $recharge_gear->give;
            }

            $favorable_price = $Recharge + $give;
            $czReason = 1;
            $cjReason = 45;
        }

        return [$give, $favorable_price, $Recharge, $czReason, $cjReason, $second_give];

    }

    /**
     * 添加玩家充值记录
     * @param $user_id
     * @param $payAmt
     * @param $favorable_price
     * @param $order_sn
     * @param $GiftsID
     * @param $Recharge
     * @param $czReason
     * @param $give
     * @param $cjReason
     * @param $AdId
     * @param $eventType
     */
    public function addRecord($user_id, $payAmt, $favorable_price, $order_sn, $GiftsID, $Recharge, $czReason, $give, $cjReason, $AdId, $eventType)
    {

        if ($payAmt > 0) {

            // 增加玩家充值金额
            $query = DB::connection('write')->table('QPAccountsDB.dbo.YN_VIPAccount')
                ->where('UserID', $user_id)
                ->value('Recharge');
            if ($query) {
                DB::connection('write')->table('QPAccountsDB.dbo.YN_VIPAccount')
                    ->where('UserID', $user_id)
                    ->increment('Recharge', $payAmt);
            } else {
                DB::connection('write')->table('QPAccountsDB.dbo.YN_VIPAccount')
                    ->where('UserID', $user_id)
                    ->insert(['Recharge' => $payAmt, 'UserID' => $user_id]);

                // 首次充值：金币银币切换 + 数据清理
                /*
 * 金币银币切换 GameScoreInfo 将score的数据复制到 InsureScore 把Score 字段置0 把 ScoreChange字段设置成1
 * 清理用户的数据
 * GameScoreInfo的MaxScore MaxWinscore清0
 * RecordUserTotalStatistics 表 数据清0
 * RecordUserDataStatisticsNew 表数据 清0
 * RecordUserGameCount 关于用户的数据删除
 *
*/

                try {
                    $this->switchToInsureScoreAndCleanData($user_id);
                } catch (\Exception $e) {
                    \Log::error('首次充值-金币银币切换失败', [
                        'user_id' => $user_id,
                        'error' => $e->getMessage()
                    ]);
                }

            }

            //在这里更新 RecordUserTotalStatistics 数据 将LastRechargeValue字段更新为payAmt 如果不存在则插入
            DB::connection('write')->table('QPRecordDB.dbo.RecordUserTotalStatistics')
                ->updateOrInsert(['UserID' => $user_id], ['LastRechargeValue' => $payAmt]);

            


        }
        if ($Recharge > 0) {
            // 添加日志记录表
            StoredProcedure::addPlatformData($user_id, 3, $Recharge * NumConfig::NUM_VALUE);
            // 增加用户金币变化记录
            $AfterScore = RecordScoreInfo::addScore($user_id, ($Recharge * NumConfig::NUM_VALUE), $czReason); #充值
            if ($AfterScore) {
                RecordScoreInfo::addScore($user_id, ($give * NumConfig::NUM_VALUE), $cjReason, $AfterScore); #赠送彩金
            }
        }
        $favorable_price =  (int) round($favorable_price * NumConfig::NUM_VALUE);
        $firstScore = DB::connection('write')->table('QPTreasureDB.dbo.GameScoreInfo')->where('UserID', $user_id)->value('Score');
        $Score = $favorable_price + $firstScore;




        if ($payAmt > 0) {
            try {
                $userInfo = DB::table(TableName::QPAccountsDB() . 'AccountsInfo')
                    ->where('UserID', $user_id)
                    ->first();
                $channelConfig = DB::table('QPPlatformDB.dbo.ChannelPackageName')->where('Channel', $userInfo->Channel)->first();


//                Util::WriteLog('xxxxx', [$userInfo->Channel, $channelConfig, $query, $firstScore, $channelConfig->Rate > 0 && $channelConfig->ContrlScore > 0, $channelConfig->MinScore * NumConfig::NUM_VALUE > $firstScore]);

                if ($channelConfig && !$query && false) {
                    if ($channelConfig->Rate > 0 && $channelConfig->ContrlScore > 0) {
                        if ($channelConfig->MinScore * NumConfig::NUM_VALUE >= $firstScore) {
                            $openGames = config('games.openKGame');
                            $query = DB::table('QPTreasureDB.dbo.UserScoreControl')->where('UserID', $user_id)->first();
                            if (!$query) {
                                $build_sql = DB::connection('write')->table('QPTreasureDB.dbo.UserScoreControl');
                                //Util::WriteLog('control_old_user',$list);
                                $data = [
                                    'ControlScore'   => (int)($channelConfig->ContrlScore * NumConfig::NUM_VALUE),
                                    'EffectiveScore' => 0,
                                    'ControlKindID'  => -1,
                                    'Remarks'        => '',
                                    'InsertDate'     => date('Y-m-d H:i:s'),
                                    'ControlRadian'  => 0
                                ];
                                $build_sql->updateOrInsert(['UserID' => $user_id], $data);

                                foreach ($openGames as $GameID) {
                                    $KindData = [
                                        'UserID'        => $user_id,
                                        'KindID'        => $GameID,
                                        'ControlRadian' => $channelConfig->Rate,
                                        'ControlDate'   => date('Y-m-d H:i:s')
                                    ];
                                    DB::connection('write')->table('QPTreasureDB.dbo.UserControlKind')->updateOrInsert(['UserID' => $user_id, 'KindID' => $GameID], $KindData);
                                }
                            }

                        }
                    }
                }
            } catch (\Exception $exception) {

            }
            // 记录订单变化后金币
            DB::connection('write')->table('agent.dbo.order')
                ->where('order_sn', $order_sn)
                ->update(['after_amount' => $Score]);

            // 增加用户充值变化值
            RecordUserDataStatistics::updateOrAdd($user_id, 0, $payAmt);

        }
        // 不是周卡的时候执行
        if ($GiftsID < 100 || $GiftsID >= 200) {
            // 增加用户金币
            DB::connection('write')->table('QPTreasureDB.dbo.GameScoreInfo')->where('UserID', $user_id)->increment('Score', $favorable_price);
        }


        // 充值推广佣金
//        (new AgentUser())->reward($user_id, $payAmt, $order_sn);
//


        // 周卡 -- 执行存储过程
        if (isset($GiftsID) && $GiftsID > 100 && $GiftsID < 200) {
            $CardID = (int)$GiftsID - 100;
            StoredProcedure::BuyMonthCard($user_id, $CardID, $order_sn);
            // 开始执行时间
            $startTime = Helper::millisecond();
            Log::info('GSP_GP_BuyMonthCard 执行时间：' . ((Helper::millisecond() - $startTime) / 1000));
        }


        //设置第二天要领取
        if (isset($GiftsID) && $GiftsID >= 200 && $GiftsID < 300 ) {
            $first = DB::table('agent.dbo.recharge_gear')->where('gift_id', $GiftsID)->select('gift_id', 'money', 'give', 'favorable_price', 'second_give')->first();
            if ($first && $first->second_give > 0) {
                $fpkey = 'Firstpay_' . $user_id;
                $data = (array)$first;
                $data['buytime'] = time();
                $data['czReason'] = $czReason;
                $data['cjReason'] = $cjReason;
                Redis::set($fpkey, json_encode($data));
                DB::table(TableName::agent() . 'guide_payment')->updateOrInsert([
                    'UserID'     => $user_id,
                    'GiftID'     => $GiftsID,
                    'CreateTime' => now()
                ], ['UserID' => $user_id]);
            }
        }

        //设置第二天要领取
        if (!empty($GiftsID) && $GiftsID >= 300 && $GiftsID < 400 ) {
            Redis::del('repay_temp_'.$user_id);
        }

        // 数据统计后台 -- 充值记录添加
        (new RechargeWithDraw())->recharge($user_id, $payAmt);
//        (new RechargeWithDraw())->recharge($user_id, $Recharge);

        if ($AdId && $payAmt) AfEvent::dispatch([$user_id, $payAmt, $AdId, $eventType]);
        try {
            //新邀请
            (new AgentController())->processDeposit($user_id, $payAmt,$order_sn);

//            AgentService::recordPerformance($user_id, $payAmt * NumConfig::NUM_VALUE);
        } catch (\Exception $exception) {
            Util::WriteLog("AgentService", $exception->getTraceAsString());
        }
        return [$Score];
    }

    /**
     * 执行存储过程
     * @param $user_id
     * @param $payAmt
     * @param $favorable_price
     * @param $Score
     * @param $GiftsID
     */
    public function storedProcedure($user_id, $payAmt, $favorable_price, $Score, $GiftsID)
    {


        // 开始执行时间
        $startTime = Helper::millisecond();

        // 执行存储过程 -- 防刷机制
        StoredProcedure::SetUserTabType($user_id);

        Log::info('GSP_GP_SetUserTabType12 执行时间：' . ((Helper::millisecond() - $startTime) / 1000));

        # 单控标签 -- 执行存储过程
        StoredProcedure::user_label($user_id, 1, $payAmt);

        Log::info('CheckAccountsLabel 执行时间：' . ((Helper::millisecond() - $startTime) / 1000));


        // 服务器通知
//        $url = config('transfer.stock')['url'] . 'notifyPay';
//        Log::info('中转服参数 ' . json_encode([
//                'userid'  => $user_id, 'getScore' => $favorable_price, 'score' => $Score,
//                'giftsid' => empty($GiftsID) ? 0 : $GiftsID,
//                'url'     => $url
//            ]));
//        $res = (new HttpCurl())->service($url, ['userid' => $user_id, 'getScore' => $favorable_price, 'score' => $Score, 'giftsid' => empty($GiftsID) ? 0 : $GiftsID]);
//
//        Log::info('中转服 执行时间：' . ((Helper::millisecond() - $startTime) / 1000), [
//            'res' => $res,
//        ]);


        // AF 事件
//        (new AppflyerEvent())->event($user_id, '', 'af_purchase_new', $payAmt);
//        Log::info('AF 执行时间：' . ((Helper::millisecond() - $startTime) / 1000));

    }

    /**
     * 首次充值：金币银币切换 + 数据清理
     * @param int $user_id 用户ID
     */
    private function switchToInsureScoreAndCleanData($user_id)
    {
        \Log::info('开始执行金币银币切换', ['user_id' => $user_id]);

        try {
            // 1. GameScoreInfo: 将Score的数据复制到InsureScore，把Score字段置0，把ScoreChange字段设置成1
            $scoreInfo = DB::connection('write')->table('QPTreasureDB.dbo.GameScoreInfo')
                ->where('UserID', $user_id)
                ->first();

            if ($scoreInfo) {
                DB::connection('write')->table('QPTreasureDB.dbo.GameScoreInfo')
                    ->where('UserID', $user_id)
                    ->update([
                        'InsureScore' => max($scoreInfo->Score,40),  // 将Score复制到InsureScore
                        'Score' => 0,                         // Score置0
                        'ScoreChange' => 1,                   // ScoreChange设置成1
                        'MaxScore' => 0,                      // MaxScore清0
                        'MaxWinScore' => 0                    // MaxWinScore清0
                    ]);

                \Log::info('GameScoreInfo切换成功', [
                    'user_id' => $user_id,
                    'original_score' => $scoreInfo->Score,
                    'insure_score' => $scoreInfo->Score
                ]);
            }

            // 2. RecordUserTotalStatistics 表数据清0
            $totalStats = DB::connection('write')->table('QPRecordDB.dbo.RecordUserTotalStatistics')
                ->where('UserID', $user_id)
                ->first();

            if ($totalStats) {
                DB::connection('write')->table('QPRecordDB.dbo.RecordUserTotalStatistics')
                    ->where('UserID', $user_id)
                    ->update([
                        'Winning' => 0,
                        'LostInning' => 0,
                        'Revenue' => 0,
                        'WinScore' => 0,
                        'LostScore' => 0,
                        'Handsel' => 0,
                        'DrawBase' => 0,
                        'TotalBet' => 0,
                        'TotalScore' => 0,
                        'MaxDrawBase' => 0,
                        'MaxScore' => 0,
                        'MaxWinScore' => 0,
                        'Rounds' => 0,
                        'ProtectedRounds' => 0
                    ]);

                \Log::info('RecordUserTotalStatistics清0成功', ['user_id' => $user_id]);
            }

            // 3. RecordUserDataStatisticsNew 表数据清0
            DB::connection('write')->table('QPRecordDB.dbo.RecordUserDataStatisticsNew')
                ->where('UserID', $user_id)
                ->delete();

            \Log::info('RecordUserDataStatisticsNew清0成功', ['user_id' => $user_id]);

            // 4. RecordUserGameCount 关于用户的数据删除
            DB::connection('write')->table('QPRecordDB.dbo.RecordUserGameCount')
                ->where('UserID', $user_id)
                ->delete();

            \Log::info('RecordUserGameCount清除成功', ['user_id' => $user_id]);

            \Log::info('金币银币切换完成', [
                'user_id' => $user_id,
                'insure_score' => $scoreInfo->Score ?? 0
            ]);

        } catch (\Exception $e) {
            \Log::error('金币银币切换异常', [
                'user_id' => $user_id,
                'error' => $e->getMessage(),
                'trace' => $e->getTraceAsString()
            ]);
            throw $e;
        }
    }
}
