<?php


namespace App\Http\Controllers\Api;


//use App\Http\logic\api\UuPayCashierLogic;
use App\dao\Pay\AccountPayInfo;
use App\Http\logic\api\CryptoLogic;
use App\Inter\PayMentInterFace;
use App\Notification\DingDingRobot;
use App\Notification\TelegramBot;
use App\Services\PayConfig;
use App\Util;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;

class CryptoController implements PayMentInterFace
{
    private $retryTimes=0;
    public function pay_order($userId, $payAmt, $userName, $userEmail, $userPhone, $GiftsID, $buyIP, $AdId, $eventType, $pay_method = '')
    {

        $logic = new CryptoLogic();
        try {
            $res = $logic->pay_order($userId, $payAmt, $userPhone, $userEmail, $userName, $GiftsID, $buyIP, $AdId, $eventType);
        } catch (\Exception $exception) {

            Redis::set("PayErro_Crypto",1);
            Redis::expire("PayErro_Crypto",600);
            Util::WriteLog('Crypto_error', $exception->getMessage().json_encode($logic->result));

            TelegramBot::getDefault()->sendMsgWithEnv("Crypto Except ".$exception->getMessage().$exception->getTraceAsString() );
            return apiReturnFail($logic->getError());
        }


        if (!empty($res)) {
            TelegramBot::getDefault()->sendMsg(json_encode($res));
            $data = [
                'content' => urldecode($res['redirectURL']),
                'money' => $payAmt,
                'prdOrdNo' => $res['mchOrderNo'],
                'redirectURL' => urldecode($res['redirectURL']),
            ];
            return apiReturnSuc($data);
//            header("Location: {$res['url']}");
        } else if($res==false) {
            return apiReturnFail($logic->getError());
        }else{
            if($this->retryTimes>0 || true) {
                Redis::set("PayErro_Crypto",1);
                Redis::expire("PayErro_Crypto",600);
                TelegramBot::getDefault()->sendProgramNotify("Crypto RetrunFail ", $logic->getError()." | ".json_encode($res));
                return apiReturnFail($logic->getError());
            }else{
                $this->retryTimes++;
                return $this->pay_order($userId, $payAmt, $userName, $userEmail, $userPhone, $GiftsID, $buyIP, $AdId, $eventType);
            }
        }

    }

    // 支付异步回调
    public function notify(Request $request)
    {

        $post = $request->all();
        if (!is_array($post)) {
            $post = \GuzzleHttp\json_decode($post, true);
        }

        Util::WriteLog('Crypto', $post);
        $post = @$post['data'];
        $order_sn = @$post['externalOrderId'];
        $logic = new CryptoLogic();
        try {
            $redis = Redis::connection();
            $ret= $logic->notify($post);
            if($ret=='SUCCESS')$redis->set($order_sn, $order_sn, 3600 * 24);
            return $ret;
        }catch (\Exception $exception){
            Redis::set("PayErro_Crypto",1);
            Redis::expire("PayErro_Crypto",600);
            TelegramBot::getDefault()->sendProgramNotify("Crypto 订单回调执行 异常 ", json_encode($post),$exception);
            Util::WriteLog("Crypto_error",$post);
            return 'fail';
        }
    }

    public function sync_notify(Request $request)
    {
        Log::info('同步回调');
        echo '同步回调';
    }


    // 提现异步回调
    public function cash_notify(Request $request)
    {
        $headers = [
            "X-Account"   => $request->header("X-Account"),
            "X-Signature" => $request->header("X-Signature"),
        ];
        $payload = file_get_contents('php://input');
        $service = new SitoBank();
        $verify = $service->verify($payload, $headers['X-Signature']);

        $post = json_decode($payload, true);

        Util::WriteLog('SitoBank', "SitoBank cash 异步回调\n".json_encode(compact("payload", "headers", 'verify')));

        if ($headers['X-Account']==$service->config['merchantCode']) {
            //稍后处理verify
        }else if(!$verify){
            Util::WriteLog('SitoBank cash','签名错误');
            return 'fail';
        }

        $logic = new SitoBankCashierLogic();
        try {
            return $logic->notify($post);
        }catch (\Exception $exception){

            TelegramBot::getDefault()->sendProgramNotify("SitoBank 提现异步回调执行 异常 ", json_encode($post),$exception);
            Util::WriteLog("SitoBank_error",$post);
            return '{"success":false,"message":"商户自定义出错信息"}';
        }
    }
}
