<?php

namespace App\Http\Controllers\Api;

use App\Command\Log;
use App\Models\Adapay;
use App\Models\OrderDivideRecord;
use App\Models\Good as GoodModel;
use App\Models\OrderInfo;
use App\Models\OrderGoods;
use App\Models\OrderInfo as OrderInfoModel;
use App\Models\MerchantGoodSku;
use App\Models\PaymentRecord;
use App\Models\HfPayconfirm;
use Dcat\Admin\Grid\Displayers\Orderable;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use League\CommonMark\Node\Query\OrExpr;

class HfOrderController extends BaseController
{
    //退款回调
    public function refundNotify()
    {
        Log::add('--撤销回调结果--', $_POST);
        $fields = $_POST ?? [];

        $res = (new Adapay())->refundNotify($fields);
        return $res;
    }

    //手动创建支付确认对象
    public function paymentConfirm(Request $request)
    {
        $order_id = $request->order_id ?? 0;

        $orderObj = OrderInfo::where(['id' => $order_id])->first();
        if (!$orderObj) {
            return $this->JsonResponse('', '订单不存在', 201);
        }

        //解冻通知
        $order_no = $orderObj->order_sn;
        $freeze_stat = $message['freeze_stat'] ?? '';
        if ($orderObj->freeze_stat == 'FREEZE') {
            //交易记录
            $prObj = PaymentRecord::where('order_sn', $order_no)->first();
            # 支付确认参数设置
            $payment_params = array(
                "payment_id" => $prObj->payment_id,
                "order_no" => 'payconfirm_' . date("YmdHis") . rand(100000, 999999),
                "confirm_amt" => 0,
                "description" => "",
                "div_members" => "" //分账参数列表 默认是数组List
            );

            DB::beginTransaction();
            try {
                //分账列表
                $divResult = OrderDivideRecord::divide($orderObj->id, $payment_params['order_no']); //返回分账参数列表
                $payment_params['div_members'] = $divResult['div_members'];
                $payment_params['confirm_amt'] = $divResult['confirm_amt'];
                Log::add('发起支付确认', $payment_params);
                $orderObj->freeze_stat = 'UNFREEZE';
                if ($orderObj->save()) {
                    $result = (new Adapay())->createPaymentConfirm($payment_params);
                    if ($result['status'] == 'succeeded') {
                        (new HfPayconfirm())->add($payment_params, $result['fee_amt']);
                    }
                }
                DB::commit();
            } catch (\Exception $e) {
                Log::add('解冻,支付确认对象失败', $e->getMessage());
                DB::rollBack();
                return $this->JsonResponse('', $e->getMessage(), 201);
            }
            return $this->JsonResponse($result);
        }
    }

    //定时任务--查询支付对象列表
    public function autoQueryList()
    {
        $payment_params = array(
            "app_id" => env('HUIFU_APPID'),
            //"payment_id" => "10000000000000001",
            //"order_no" => "20190919071231283468359213",
            "page_index" => "",
            "page_size" => "",
            "created_gte" => "",
            "created_lte" => ""
        );
        $chunkSize = 10; // 每次处理的订单数量
        $orders = OrderInfoModel::where(["freeze_stat" => 'FREEZE'])->orderBy('id', 'desc')->take($chunkSize);
        while ($orders->count() > 0) {
            $orders->chunk($chunkSize, function ($batch) use ($payment_params) {
                foreach ($batch as $order) {
                    $nowtime = time();
                    $pyObj = PaymentRecord::where('order_sn', $order->order_sn)->first();
                    $payment_params['payment_id'] = $pyObj->payment_id;
                    $payment_params['order_no'] = $pyObj->order_sn;
                    $result = (new Adapay())->queryList($payment_params);
                    // if ($order->created_at) {
                    //     $created_at = strtotime($order->created_at);
                    //     $diff_time = $nowtime - $created_at;
                    //     if ($diff_time > 900) {
                    //         $order->save();
                    //     }
                    // }
                }
            });

            // 移动游标到下一批
            $orders->skip($chunkSize);
            $orders = $orders->getQuery();
            sleep(2);
        }

        return '--ok--';
    }
}