<?php

namespace app\controller\api;

use app\model\Withdraw;
use app\model\User;
use app\model\ExchangeRate;
use app\model\Userbank;

use support\Request;
use App\Utils\API\Payment;
use App\Utils\API\PaymentNew;
use App\Utils\ApiResponse;
use App\Utils\ApiResponseApp;

use App\dao\UserRewardDao;
use hg\apidoc\annotation as Apidoc;
use Carbon\Carbon;

use support\Log;

/**
 * @Apidoc\Title("提现订单")
 */

class WithdrawController
{
    /**
     * 不需要token认证的方法
     */
    protected $noNeedLogin = ['callback'];
    /**
     * 手续费
     */
    protected static $handlingFee=0;
    /**
     * @Apidoc\Title("1.0 查询当前用户提现订单")
     * @Apidoc\Url("api/withdraw/withdrawCashList")
     * @Apidoc\Method("POST")
     */
    public function withdrawCashList(Request $request)
    {
        $page = $request->post('page', 1);  // 默认第一页
        $size = $request->post('size', 15); // 默认每页15条
        $status = $request->post('status', 0); // 默认状态为0(全部)
        $time = $request->post('time', null); // 默认时间不做过滤

        $userId = $request->data['id'];

        // 初始化查询构建器
        $query = Withdraw::query();

        // 根据状态过滤
        if ($status != 0) {
            $query->where('status', $status);
        }

        // 根据时间过滤
        if (!is_null($time)) {
            $todayStart = Carbon::now()->startOfDay(); // 今天的开始时间 (00:00:00)
            $todayEnd = Carbon::now()->endOfDay();     // 今天的结束时间 (23:59:59)
            $yesterdayStart = Carbon::now()->subDay()->startOfDay(); // 昨天的开始时间
            $sevenDaysAgoStart = Carbon::now()->subDays(7)->startOfDay(); // 七天前的开始时间

            switch ($time) {
                case 1:
                    $query->whereBetween('createtime2', [$todayStart, $todayEnd]);
                    break;
                case 2:
                    $query->whereBetween('createtime2', [$yesterdayStart, $todayEnd]);
                    break;
                case 3:
                    $query->whereBetween('createtime2', [$sevenDaysAgoStart, $todayEnd]);
                    break;
            }
        }

        // 添加用户ID过滤条件
        $query->where('user_id', $userId);

        // 查询结果
        $withdrawOrders = $query->orderBy('createtime2', 'desc')
            ->skip(($page - 1) * $size)
            ->take($size)
            ->get();

        // 手动映射字段
        // $withdrawOrders = $withdrawOrders->map(function ($item) {
        //     // 将 money 字段映射为 amount
        //     $item->amount = $item->money;

        //     unset($item->money); // 删除原始的 money 字段
        //     return $item;
        // });
        // $withdrawOrders->money = 100;
        // var_dump($withdrawOrders);

        // 返回成功响应
        return ApiResponseApp::success($withdrawOrders);
    }

    /**
     * @Apidoc\Title("小于1000直接转账,大于1000生成审批")
     * @Apidoc\Url("api/withdraw/submit")
     * @Apidoc\Method("POST")
     */
    public function submit(Request $request)
    {
        $money_no = $request->post('money');
        //用户存了一个 转账信息 这里是用户转账信息的id
        $bank_id = $request->post('bank_id');
        $user_id = $request->data['id'];
        $today = date('Y-m-d');
        //判断用户今天提现几次
        if (Withdraw::where('user_id', $user_id)->where('created_at', '>=', $today . " 00:00:00")->count() >= 3) {
            return ApiResponseApp::error(null, '每天只能提现三次');
        }
        $user = User::find($user_id);
        if($money_no>$user->money){
            return ApiResponseApp::error(null, '提现积分不足');
       }
        //提现金额
        $rate = ExchangeRate::where('type', 'BDT')->get();
        $money = (int)$money_no / 100 * $rate[0]['points'];

        $withdraw = Withdraw::create([
            'user_id' => $user_id,
            'amount' => $money,
            'status' => 1,
            'createtime2' => date('Y-m-d H:i:s'),
            'username' => $user->username,
            'status_text' => '申请中',
        ]);
        //大于1000积分等待管理员审核
        if ($money_no >= 100000) {
            //用户积分减少$money
            UserRewardDao::base($user_id, 1, - ($money_no + self::$handlingFee), '提现');
            return ApiResponseApp::success(null, '等待管理员审核');
        }
        
        //用户积分减少$money
        UserRewardDao::base($user_id, 1, - ($money_no + self::$handlingFee), '提现');
        $userbank = Userbank::where('id', $bank_id)->first();
        //获取刚刚存入数据库的id(订单号)
        $orderId = $withdraw->id;
        $res = PaymentNew::pushMoney($money, $userbank->bank_username, $userbank->account, $userbank->bank_name, $orderId);
        // //逻辑错误需要修改
        if ($res->Success) {
            $withdraw->update([
                'status' => 4, //
                'status_text' => '等待银行打款',
                'order_number' => $res->TrackingNumber ?? null,
            ]);
            return ApiResponseApp::success(null, '转账成功');
        } else {
            $errorMsg = '';
            if($res->ErrorMessage == "CheckIpAddressFailed"){
                $errorMsg = 'IP 检查失败';
            }
            if($res->ErrorMessage == "CheckEncryptValueFailed "){
                $errorMsg = '加密检查失败';
            }
            if($res->ErrorMessage == "PaymentChannelClosed"){
                $errorMsg = '平台休息中,暂不接单';
            }
            if($res->ErrorMessage == "InsufficientBalance"){
                $errorMsg = '余额不足';
            }
            if($res->ErrorMessage == "TryAgainLater"){
                $errorMsg = '系统忙碌中,请稍后再试';
            }
            if($res->ErrorMessage == "DevError"){
                $errorMsg = '程式错误,请联络开发人员';
            }
            if($res->ErrorMessage == "PayeeAccountNameFormatError"){
                $errorMsg = '收款人帐号格式错误';
            }
            if($res->ErrorMessage == "PayeeAccountNumberFormatError"){
                $errorMsg = '收款人卡号格式错误';
            }
            if($errorMsg == ''){
                $errorMsg = '未知错误';
            }
            $withdraw->update([
                'status' => 5, //
                'status_text' => '支付错误:'.$res->ErrorMessage
            ]);
            UserRewardDao::base($user_id, 1, $money_no + self::$handlingFee, '提现失败返还');
            // if ($res->ErrorMessage == "PayeeAccountNameFormatError") {
            //     return ApiResponseApp::error(null, '收款人帐号格式错误');
            // }
            return ApiResponseApp::error(null, $res->ErrorMessage);
        }
    }


    /**
     * @Apidoc\Title("请求回调")
     * @Apidoc\Url("api/withdraw/callback")
     * @Apidoc\Method("POST")
     */
    public function callback(Request $request)
    {
        $callbackData = $request->all();
        // 记录回调数据以便调试
        Log::info('Payment Callback Received:', $callbackData);
        $orderId = $callbackData['TrackingNumber'] ?? null;
        $failedMessage = $callbackData['FailedMessage'] ?? null;
        $amount = $callbackData['Amount'] ?? null;

        $withdraw = Withdraw::where('order_number', $orderId)->first();
        //$failedMessage为null就是成功
        if ($failedMessage != null) {
            if($withdraw->status == 5){
                return;
            }
            $rate = ExchangeRate::where('type', 'BDT')->get();
            $money = $amount * 100 / $rate[0]['points'] + 300;
            UserRewardDao::base($withdraw->user_id, 1, $money, '提现失败返还');
            $withdraw->update([
                'status' => 5,
                'status_text' => '支付失败: ' . $failedMessage,
            ]);
        } else {
            $withdraw->update([
                'status' => 2,
                'status_text' => '已到账',
            ]);
        }
    }
}