<?php

namespace App\Http\Controllers\Api;

use App\Command\Log;
use Illuminate\Http\Request;
use App\Models\Adapay;
use App\Models\HfCompanyMember;
use App\Models\HfSettleAccount;
use App\Jobs\AutoOrderDivide;
use Exception;
use Illuminate\Support\Facades\DB;

class HfSettleAccountController extends BaseController
{
    //创建普通用户结算账户
    public function createMemberAccount(Request $request)
    {
        $card_id = $request->card_id ?? '';
        $card_name = $request->card_name ?? '';
        $tel_no = $request->tel_no ?? '';
        $cert_id = $request->cert_id ?? '';
        if (!$card_id || !$card_name || !$tel_no || !$cert_id) {
            return $this->JsonResponse('', '必填项不为空', 500);
        }
        $userObj = $request->user();
        $user_id = $userObj->id;
        $member_id = $userObj->member_id;
        if (!$member_id) {
            return $this->JsonResponse('', '账户异常,请联系管理员', 500);
        }
        $account_params = array(
            "app_id" => env('HUIFU_APPID'),
            "member_id" => $member_id,
            "channel" => "bank_account",
            "account_info" => [
                "card_id" => $card_id,
                "card_name" => $card_name,
                "cert_id" => $cert_id,
                "cert_type" => "00",
                "tel_no" => $tel_no,
                "bank_acct_type" => "2",
            ]
        );
        $local_params = [
            'member_type' => 0,
            'mid' => $user_id,
            'card_id' => $card_id,
            'card_name' => $card_name,
            'cert_id' => $cert_id,
            'cert_type' => '00',
            'tel_no' => $tel_no,
            'bank_acct_type' => 2
        ];

        DB::beginTransaction();
        try {
            # 创建
            $result = (new Adapay())->createMemberSettleAccount($account_params);
            if (isset($result['status']) && $result['status'] == 'succeeded') {
                $local_params['account_id'] = $result['id'];
                $local_params['created_at'] = date("Y-m-d H:i:s", $result['create_time']);
                DB::table('hf_settle_account')->insert($local_params);
                //发起分账
                $this->dispatch(new AutoOrderDivide($user_id, 10));
            } else {
                throw new Exception($result['error_msg']);
            }

            DB::commit();
            return $this->JsonResponse('');
        } catch (\Exception $exception) {
            Log::add('添加用户结算账户失败', $exception->getMessage());
            DB::rollBack();
            return $this->JsonResponse('', $exception->getMessage(), 500);
        }
    }


    //创建企业用户结算账户
    public function createCompanyAccount(Request $request)
    {
        $card_id = $request->card_id ?? '';
        $card_name = $request->card_name ?? '';
        $tel_no = $request->tel_no ?? '';
        $bank_code = $request->bank_code ?? '';
        $bank_name = $request->bank_name ?? '';
        $prov_code = $request->prov_code ?? '';
        $area_code = $request->area_code ?? '';
        if (!$card_id || !$card_name || !$tel_no || !$bank_code || !$prov_code || !$area_code) {
            return $this->JsonResponse('', '必填项不为空', 500);
        }
        $userObj = $request->user();
        $merchant_id = 3; //$userObj->merchant_id;
        $exist = HfCompanyMember::where(['merchant_id' => $merchant_id, 'member_id' => 'cm_id' . $merchant_id])->count();
        if (!$exist) {
            return $this->JsonResponse('', '账户异常,请联系管理员', 500);
        }
        $member_id = 'cm_id' . $merchant_id;
        $account_params = array(
            "app_id" => env('HUIFU_APPID'),
            "member_id" => $member_id,
            "channel" => "bank_account",
            "account_info" => [
                "card_id" => $card_id,
                "card_name" => $card_name,
                "tel_no" => $tel_no,
                "bank_code" => $bank_code,
                "bank_name" => $bank_name,
                "bank_acct_type" => "1",
                "prov_code" => $prov_code,
                "area_code" => $area_code,
            ]
        );
        $local_params = [
            'member_type' => 1,
            'mid' => $merchant_id,
            'card_id' => $card_id,
            'card_name' => $card_name,
            "bank_code" => $bank_code,
            "bank_name" => $bank_name,
            'tel_no' => $tel_no,
            'bank_acct_type' => 1,
            "prov_code" => $prov_code,
            "area_code" => $area_code,
        ];

        DB::beginTransaction();
        try {
            # 创建
            $result = (new Adapay())->createMemberSettleAccount($account_params);
            if (isset($result['status']) && $result['status'] == 'succeeded') {
                $local_params['account_id'] = $result['id'];
                $local_params['created_at'] = date("Y-m-d H:i:s", $result['create_time']);
                DB::table('hf_settle_account')->insert($local_params);
            } else {
                throw new Exception($result['error_msg']);
            }

            DB::commit();
            return $this->JsonResponse('');
        } catch (\Exception $exception) {
            Log::add('添加用户结算账户失败' . $member_id, $exception->getMessage());
            DB::rollBack();
            return $this->JsonResponse('', $exception->getMessage(), 500);
        }
    }

    //查询已绑定结算账户
    public function myCard(Request $request)
    {
        $userObj = $request->user();
        $member_type = $request->member_type ?? 0;
        $role_id = $useObj->role_id ?? '';
        if ($role_id == 1) { //商家
            $mid = $userObj->merchant_id;
            $member_id = HfCompanyMember::where(['merchant_id' => $mid, 'status' => 'succeeded'])->value('member_id');
        } else {
            $mid = $userObj->id;
            $member_id = $userObj->member_id;
        }
        if (!$member_id) {
            return $this->JsonResponse('', '参数错误', 201);
        }

        $account_params = [];
        $accountObj = HfSettleAccount::where(['member_type' => $member_type, 'mid' => $mid])->first();
        if ($accountObj) {
            $account_params = array(
                'card_id' => $accountObj->card_id ?? '',
                'card_name' => $accountObj->card_name ?? '',
                'tel_no' => $accountObj->tel_no ?? '',
                'bank_code' => $accountObj->bank_code ?? '',
                'bank_name' => $accountObj->bank_name ?? '',
            );
        }

        return $this->JsonResponse($account_params);
    }

    //查询账户余额
    public function queryBalance(Request $request)
    {
        $userObj = $request->user();
        //$member_type = $request->member_type ?? 0;
        $role_id = $useObj->role_id ?? '';
        if ($role_id == 1) { //商家
            $mid = $userObj->merchant_id;
            $member_id = HfCompanyMember::where(['merchant_id' => $mid, 'status' => 'succeeded'])->value('member_id');
        } else {
            $mid = $userObj->id;
            $member_id = $userObj->member_id;
        }
        if (!$member_id) {
            return $this->JsonResponse('', '账户异常,请联系管理员', 500);
        }

        $account_params = [
            'app_id' => env('HUIFU_APPID'),
            'member_id' => $member_id,
        ];
        $result = (new Adapay())->queryBalance($account_params);
        if (isset($result['status']) && $result['status'] == 'succeeded') {
            return $this->JsonResponse($result);
        } else {
            return $this->JsonResponse('', '查询失败', 201);
        }
    }

    //银行代码
    public function getBankCode()
    {
        $data = [
            ['code' => '01020000', 'title' => '工商银行'],
            ['code' => '01030000', 'title' => '农业银行'],
            ['code' => '01040000', 'title' => '中国银行'],
            ['code' => '01050000', 'title' => '建设银行'],
            ['code' => '03010000', 'title' => '交通银行'],
            ['code' => '03134402', 'title' => '平安银行'],
            ['code' => '03020000', 'title' => '中信银行'],
            ['code' => '03030000', 'title' => '光大银行'],
            ['code' => '03040000', 'title' => '华夏银行'],
            ['code' => '03050000', 'title' => '民生银行'],
            ['code' => '03060000', 'title' => '广发银行'],
            ['code' => '03080000', 'title' => '招商银行'],
            ['code' => '03090000', 'title' => '兴业银行'],
            ['code' => '03100000', 'title' => '浦发银行'],
            ['code' => '03130011', 'title' => '北京银行'],
            ['code' => '03130012', 'title' => '天津银行'],
            ['code' => '03130031', 'title' => '上海银行'],
            ['code' => '03130032', 'title' => '江苏银行'],
            ['code' => '03130050', 'title' => '重庆银行'],
            ['code' => '03132102', 'title' => '大连银行'],
            ['code' => '03132301', 'title' => '哈尔滨银行'],
            ['code' => '03133201', 'title' => '南京银行'],
            ['code' => '03133301', 'title' => '杭州银行'],
            ['code' => '03133302', 'title' => '宁波银行'],
            ['code' => '03133308', 'title' => '温州银行'],
            ['code' => '03150000', 'title' => '恒丰银行'],
            ['code' => '03160000', 'title' => '浙商银行'],
        ];
        return $this->JsonResponse($data);
    }

    //删除结算账户
    public function deleteAccount(Request $request)
    {
        $userObj = $request->user();
        $member_type = $request->member_type ?? 0;
        $role_id = $useObj->role_id ?? '';
        if ($role_id == 1) { //商家
            $mid = $userObj->merchant_id;
            $member_id = HfCompanyMember::where(['merchant_id' => $mid, 'status' => 'succeeded'])->value('member_id');
        } else {
            $mid = $userObj->id;
            $member_id = $userObj->member_id;
        }
        if (!$member_id) {
            return $this->JsonResponse('', '参数错误', 201);
        }

        $accountObj = HfSettleAccount::where(['member_type' => $member_type, 'mid' => $mid])->first();
        $account_params = array(
            'app_id' => env('HUIFU_APPID'),
            'member_id' => $member_id,
            'settle_account_id' => $accountObj->account_id
        );

        # 删除
        $result = (new Adapay())->deleteSettleAccount($account_params);
        if (isset($result['status']) && $result['status'] == 'succeeded') {
            //删除本地
            $accountObj->delete();
            return $this->JsonResponse('');
        } else {
            return $this->JsonResponse('', '删除失败', 201);
        }
    }
}