<?php

namespace app\common\repositories\system\financial;


use app\common\dao\system\financial\FinancialDao;
use app\common\repositories\BaseRepository;
use app\common\repositories\system\merchant\MerchantRepository;
use app\common\repositories\user\UserBillRepository;
use FormBuilder\Factory\Elm;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\Route;

class FinancialRepository extends BaseRepository
{
    public function __construct(FinancialDao $dao)
    {
        $this->dao = $dao;
    }

    public function financialAccountForm($id)
    {
        $merchant = app()->make(MerchantRepository::class)->search(['mer_id' => $id])->find();

        $form = Elm::createForm(Route::buildUrl('merchantFinancialAccountSave',['id' => $id])->build());
        $form->setRule([
            Elm::radio('financial_type', '转账类型', $merchant->financial_type)
                ->setOptions([
                    ['value' => 1, 'label' => '银行卡'],
                    ['value' => 2, 'label' => '微信'],
                    ['value' => 3, 'label' => '支付宝'],
                ])->control([
                    [
                        'value' => 1,
                        'rule'=> [
                            Elm::input('name', '姓名')->value($merchant->financial_bank->name??'')->required(),
                            Elm::input('bank', '开户银行')->value($merchant->financial_bank->bank??'')->required(),
                            Elm::input('bank_code', '银行卡号')->value($merchant->financial_bank->bank_code??'')->required(),
                        ]
                    ],
                    [
                        'value' => 2,
                        'rule'=> [
                            Elm::input('name', '姓名')->value($merchant->financial_wechat->name??'')->required(),
                            Elm::input('wechat', '微信号')->value($merchant->financial_wechat->wechat??'')->required(),
                            Elm::frameImage('wechat_code', '收款二维码', '/' . config('admin.merchant_prefix') . '/setting/uploadPicture?field=wechat_code&type=1')->value($merchant->financial_wechat->wechat_code??'')->modal(['modal' => false])->width('896px')->height('480px'),
                        ]
                    ],
                    [
                        'value' => 3,
                        'rule'=> [
                            Elm::input('name', '姓名')->value($merchant->financial_alipay->name??'')->required(),
                            Elm::input('alipay', '支付宝账号')->value($merchant->financial_alipay->alipay??'')->required(),
                            Elm::frameImage('alipay_code', '收款二维码', '/' . config('admin.merchant_prefix') . '/setting/uploadPicture?field=alipay_code&type=1')->value($merchant->financial_alipay->alipay_code??'')->modal(['modal' => false])->width('896px')->height('480px'),
                        ]
                    ],

                ]),
        ]);
        return $form->setTitle('转账信息');
    }

    /**
     * TODO 保存转账信息
     * @param int $merId
     * @param array $data
     * @author Qinii
     * @day 3/18/21
     */
    public function saveAccount(int $merId,array $data)
    {
        switch ($data['financial_type'])
        {
            case 1:
                $key = 'financial_bank' ;
                $update = [
                    'name' => $data['name'],
                    'bank' => $data['bank'],
                    'bank_code' => $data['bank_code'],
                ];
                break;
            case 2:
                $key = 'financial_wechat' ;
                $update = [
                    'name' => $data['name'],
                    //'idcard' => $data['idcard'],
                    'wechat' => $data['wechat'],
                    'wechat_code' => $data['wechat_code'],
                ];
                break;
            case 3:
                $key = 'financial_alipay' ;
                $update = [
                    'name' => $data['name'],
                    //'idcard' => $data['idcard'],
                    'alipay' => $data['alipay'],
                    'alipay_code' => $data['alipay_code'],
                ];
                break;
        }
        return app()->make(MerchantRepository::class)->update($merId,[$key => json_encode($update),'financial_type' => $data['financial_type']]);
    }

    public function applyForm(int $merId)
    {
        $merchant = app()->make(MerchantRepository::class)->search(['mer_id' => $merId])->field('mer_id,mer_name,mer_money,financial_bank,financial_wechat,financial_alipay,financial_type')->find();
        $extract_minimum_line = systemConfig('extract_minimum_line') ?: 0;
        $extract_minimum_num = systemConfig('extract_minimum_num');
        $_line = bcsub($merchant->mer_money,$extract_minimum_line,2);
        $_extract = ($_line < 0) ? 0 : $_line;
        $form = Elm::createForm(Route::buildUrl('merchantFinancialCreateSave')->build());
        $form->setRule([
            [
                'type' => 'span',
                'title' => '商户名称:',
                'children' => [$merchant->mer_name]
            ],
            [
                'type' => 'span',
                'title' => '商户ID:',
                'children' => ["$merId"]
            ],
//            [
//                'type' => 'span',
//                'title' => '',
//                'children' => []
//            ],
            [
                'type' => 'span',
                'title' => '提示:',
                'children' => ['最低可提现额度:'.$extract_minimum_line.'元;最低提现金额：'.$extract_minimum_num.'元']
            ],
            [
                'type' => 'span',
                'title' => '商户余额:',
                'children' => [$merchant->mer_money]
            ],
            [
                'type' => 'span',
                'title' => '商户可提现金额:',
                'children' => [$_extract]
            ],

            Elm::radio('financial_type', '转账类型:', $merchant->financial_type)
                ->setOptions([
                    ['value' => 1, 'label' => '银行卡'],
                    ['value' => 2, 'label' => '微信'],
                    ['value' => 3, 'label' => '支付宝'],
                ])->control([
                    [
                        'value' => 1,
                        'rule'=> [
                            [
                                'type' => 'span',
                                'title' => '姓名',
                                'native' => false,
                                'children' => [$merchant->financial_bank->name??'未填写']
                            ],
                            [
                                'type' => 'span',
                                'title' => '开户银行',
                                'native' => false,
                                'children' => [$merchant->financial_bank->bank??'未填写']
                            ],
                            [
                                'type' => 'span',
                                'title' => '银行卡号',
                                'native' => false,
                                'children' => [$merchant->financial_bank->bank_code??'未填写']
                            ],
                        ]
                    ],
                    [
                        'value' => 2,
                        'rule'=> [
                            [
                                'type' => 'span',
                                'title' => '姓名',
                                'native' => false,
                                'children' => [$merchant->financial_wechat->name??'未填写']
                            ],
                            [
                                'type' => 'span',
                                'title' => '微信号',
                                'native' => false,
                                'children' => [$merchant->financial_wechat->wechat??'未填写']
                            ],
                            [
                                'type' => 'img',
                                'title' => '收款二维码',
                                'native' => false,
                                'attrs' => ['src' => $merchant->financial_wechat->wechat_code ?? ''],
                                'style' => ['width' => '86px','height' => '48px']
                            ],
                        ]
                    ],
                    [
                        'value' => 3,
                        'rule'=> [
                            [
                                'type' => 'span',
                                'title' => '姓名',
                                'native' => false,
                                'children' => [$merchant->financial_alipay->name??'未填写']
                            ],
                            [
                                'type' => 'span',
                                'title' => '支付宝账号',
                                'native' => false,
                                'children' => [$merchant->financial_alipay->alipay??'未填写']
                            ],
                            [
                                'type' => 'img',
                                'title' => '收款二维码',
                                'native' => false,
                                'attrs' => ['src' => $merchant->financial_alipay->alipay_code ?? ''],
                                'style' => ['width' => '86px','height' => '48px']
                            ],
                        ]
                    ],

                ]),
            Elm::number('extract_money', '申请金额:')->value($extract_minimum_num)->required(),
        ]);
        return $form->setTitle('申请转账');
    }

    /**
     * TODO 保存申请
     * @param int $merId
     * @param array $data
     * @author Qinii
     * @day 3/19/21
     */
    public function saveApply(int $merId,array $data)
    {
        $make = app()->make(MerchantRepository::class);
        $merchant = $make->search(['mer_id' => $merId])->field('mer_id,mer_name,mer_money,financial_bank,financial_wechat,financial_alipay')->find();

        if($merchant['mer_money'] <= 0) throw new ValidateException('余额不足');

        if($data['financial_type'] == 1){
            $financial_account = $merchant->financial_bank;
        }elseif ($data['financial_type'] == 2){
            $financial_account = $merchant->financial_wechat;
        }elseif ($data['financial_type'] == 3){
            $financial_account = $merchant->financial_alipay;
        }
        if(empty($financial_account)) throw new ValidateException('未填写银行转账信息');

        $extract_maxmum_num = systemConfig('extract_maxmum_num');
        if($extract_maxmum_num !== 0 && $data['extract_money'] > $extract_maxmum_num) throw new ValidateException('单次申请金额不得大于'.$extract_maxmum_num.'元');
        //最低提现额度
        $extract_minimum_line = systemConfig('extract_minimum_line') ? systemConfig('extract_minimum_line') : 0;
        $_line = bcsub($merchant->mer_money,$extract_minimum_line,2);
        if($_line < $extract_minimum_line) throw new ValidateException('余额大于'.$extract_minimum_line.'才可提现');
        if($data['extract_money'] > $_line) throw new ValidateException('提现金额大于可提现金额');

        //最低提现金额
        $extract_minimum_num = systemConfig('extract_minimum_num');
        if($data['extract_money'] < $extract_minimum_num) throw new ValidateException('最低提现金额'.$extract_minimum_num);

        //可提现金额
        $_line = bcsub($merchant->mer_money,$extract_minimum_line,2);
        if($_line < 0) throw new ValidateException('余额大于'.$extract_minimum_line.'才可提现');

        //最低提现金额
        if($data['extract_money'] < $extract_minimum_num) throw new ValidateException('最低提现金额'.$extract_minimum_num);

        //不足提现最低金额
        if($_line < $extract_minimum_num) throw new ValidateException('提现金额不足');

        $_money = bcsub($merchant['mer_money'],$data['extract_money'],2);

        $sn = date('YmdHis'.$merId);
        $ret = [
            'status' => 0,
            'mer_id' => $merId,
            'mer_money' => $_money,
            'financial_sn' => $sn,
            'extract_money' => $data['extract_money'],
            'financial_type' => $data['financial_type'],
            'financial_account' => json_encode($financial_account),
            'financial_status' => 0,
            'mer_admin_id' => $data['mer_admin_id'],
            'mark'  => $datap['mark']??'',
        ];
        Db::transaction(function()use($merId,$ret,$data,$make){
            $this->dao->create($ret);
            $make->subMoney($merId,(float)$data['extract_money']);
        });
    }


    /**
     * TODO 商户列表
     * @param array $where
     * @param int $page
     * @param int $limit
     * @return array
     * @author Qinii
     * @day 3/19/21
     */
    public function getAdminList(array $where,int $page,int $limit)
    {
        $where['is_del'] = 0;
        $query = $this->dao->search($where)->with([
            'merchant' => function($query){
                $query->field('mer_id,mer_name,is_trader,mer_avatar,mer_phone,mer_address');
            }
        ]);
        $count = $query->count();
        $list = $query->page($page, $limit)->select();

        return compact('count','list');
    }


    /**
     * TODO 取消/拒绝 变更状态返还余额
     * @param $merId
     * @param $id
     * @param $data
     * @author Qinii
     * @day 3/19/21
     */
    public function cancel(?int $merId,int $id,array $data)
    {
        $where = [
            'financial_id' => $id,
            'is_del' => 0,
            'status' => 0
        ];
        if($merId) $where['mer_id'] = $merId;
        $res = $this->dao->getWhere($where);
        if(!$res) throw new ValidateException('数据不存在');
        if($res['financial_status'] == 1) throw new ValidateException('当前状态无法完成此操作');
        $merId = $merId?? $res['mer_id'];
        Db::transaction(function()use($merId,$res,$id,$data) {
            $this->dao->update($id,$data);
            app()->make(MerchantRepository::class)->addMoney($merId, (float)$res['extract_money']);
        });
    }

    /**
     * TODO
     * @param $id
     * @return \FormBuilder\Form
     * @author Qinii
     * @day 4/21/21
     */
    public function markForm($id)
    {
        $data = $this->dao->get($id);
        $form = Elm::createForm(Route::buildUrl('merchantFinancialMark', ['id' => $id])->build());
        $form->setRule([
            Elm::text('mark', '备注', $data['mark'])->required(),
        ]);
        return $form->setTitle('修改备注');
    }

    /**
     * TODO
     * @param $id
     * @return \FormBuilder\Form
     * @author Qinii
     * @day 4/21/21
     */
    public function adminMarkForm($id)
    {
        $data = $this->dao->get($id);
        $form = Elm::createForm(Route::buildUrl('systemFinancialMark', ['id' => $id])->build());
        $form->setRule([
            Elm::text('admin_mark', '备注', $data['admin_mark'])->required(),
        ]);
        return $form->setTitle('修改备注');
    }

    /**
     * TODO 详情
     * @param $id
     * @return array|\think\Model|null
     * @author Qinii
     * @day 4/22/21
     */
    public function detail($id,$merId=0)
    {
        $where[$this->dao->getPk()] = $id;
        if($merId) $where['mer_id'] = $merId;
        $data = $this->dao->getSearch($where)->with(['merchant' => function($query){
            $query->field('mer_id,mer_name,mer_avatar');
        }])->find();
        if(!$data) throw new ValidateException('数据不存在');
        return $data;
    }

    /**
     * TODO 头部统计
     * @return array
     * @author Qinii
     * @day 4/22/21
     */
    public function getTitle()
    {
        $make = app()->make(MerchantRepository::class);
        //应付商户金额 = 所有商户的余额之和
        $all = $make->search(['is_del' => 0])->sum('mer_money');
        //商户可提现金额 = （每个商户的余额 - 平台设置的最低提现额度） 之和
        $extract_minimum_line = systemConfig('extract_minimum_line') ?: 0;
        $ret = $make->search(['is_del' => 0])->where('mer_money','>',$extract_minimum_line)
            ->field("sum(mer_money - $extract_minimum_line) as  money")
            ->find();
        $money = $ret->money;
        //申请转账的商户数 = 申请提现且未转账的商户数量
        $where = [
            "financial_status" => 0
        ];
        $query = $this->dao->getSearch($where)->where('status','>',-1);
        $count = $query->group('mer_id')->count();
        //申请转账的总金额 = 申请提现已通过审核，且未转账的申请金额 之和
        $where['status'] = 1;
        $all_ = $this->dao->getSearch($where)->sum('extract_money');
        $where['status'] = 0;
        $all_0 = $this->dao->getSearch($where)->sum('extract_money');
        $merLockMoney = app()->make(UserBillRepository::class)->merchantLickMoney();
        $stat = [
            [
                'className' => 'el-icon-s-goods',
                'count' => $all,
                'field' => '元',
                'name' => '应付商户金额'
            ],
            [
                'className' => 'el-icon-s-goods',
                'count' => $money,
                'field' => '元',
                'name' => '商户可提现金额'
            ],
            [
                'className' => 'el-icon-s-goods',
                'count' => $count,
                'field' => '个',
                'name' => '申请转账的商户数'
            ],
            [
                'className' => 'el-icon-s-goods',
                'count' => $all_,
                'field' => '元',
                'name' => '申请转账的总金额'
            ],
            [
                'className' => 'el-icon-s-goods',
                'count' => $all_0,
                'field' => '元',
                'name' => '待审核的总金额'
            ],
            [
                'className' => 'el-icon-s-goods',
                'count' => $merLockMoney,
                'field' => '元',
                'name' => '商户冻结金额'
            ],
        ];

        return $stat;
    }
}
