<?php

namespace app\api\controller;

use app\admin\model\Company;
use app\admin\model\WechatPlan;
use app\admin\model\WechatPlanRecord;
use app\common\controller\Api;
use app\common\model\{Category, Lave as LaveModel, User};
use liuniu\repositories\LaveRepository;
use liuniu\UtilService;
use liuniu\WechatService;
use think\Request;

class Lave extends Api
{
    protected $noNeedLogin = ['*'];
    protected $noNeedRight = ['*'];

    public function lst(Request $request)
    {
        $where = UtilService::getMore(
            [
                ['page', 1],
                ['limit', 10],
                ['cid', $this->cid],
                ['paid', 1],
                ['category_id', 0],
                ['order', ''],
                ['key', ''],
            ], $request
        );
        $this->success('获取成功', LaveModel::lst($where));
    }

    public function ify()
    {
        $this->success('获取成功', Category::getCategoryArray('lave', null, $this->cid));
    }

    public function create(Request $request)
    {
        $where = UtilService::postMore(
            [
                ['cid', $this->cid],
                ['user_id', $this->auth->getUserinfo()['id']],
                ['order_name', ''],
                ['category_id', 0],
                ['amount', 0],
                ['name', ''],
                ['contact', ''],
                ['tel', 0],
                ['address', ''],
                ['is_open', '0'],
                ['is_ticket', '0'],
                ['pay_type', '0'],
                ['type', '0'],
                ['help_id', 0],
                ['from', 'weixin'],
            ], $request
        );
        $where1 = $where;
        unset($where1['from']);
        $where1['order_id'] = LaveModel::getNewOrderId();
        if (cache('lave_' . $where['user_id'])) $this->error('正在处理中');
        @file_put_contents("lave.txt", json_encode($where1));
        $order = LaveModel::create($where1);
        cache('lave_' . $where['user_id'], '1', 10);
        if (!$order) $this->error(LaveModel::getErrorInfo());
        $orderId = $order['order_id'];
        $info = compact('orderId');
        if ($orderId) {
            $orderInfo = LaveModel::where('order_id', $orderId)->find();
            if (!$orderInfo || !isset($orderInfo['paid'])) $this->error('支付订单不存在!');
            if ($orderInfo['paid']) $this->error('支付已支付!');
            try {
                if ($where['from'] == 'routine') {
                    $jsConfig = LaveRepository::jsPay($this->cid, $orderId); //创建订单jspay
                } else if ($where['from'] == 'weixinh5') {
                    $jsConfig = LaveRepository::h5Pay($this->cid, $orderId);
                } else {
                    $jsConfig = LaveRepository::wxPay($this->cid, $orderId);
                }
            } catch (\Exception $e) {
                return $this->error($e->getMessage());
            }
            $info['jsConfig'] = $jsConfig;

            return $this->success('订单创建成功', $info);

        } else $this->error(LaveModel::getErrorInfo());
    }

    public function mylst(Request $request)
    {
        $where = UtilService::getMore(
            [
                ['page', 1],
                ['limit', 10],
                ['cid', $this->cid],
                ['user_id', $this->auth->getUserinfo()['id']],
                ['paid', -1],
                ['category_id', 0],
            ], $request
        );
        $this->success('获取成功', LaveModel::lst($where));
    }

    /**
     * 订单支付
     * @param Request $request
     * @return mixed
     */
    public function pay(Request $request)
    {
        list($uni, $paytype, $from) = UtilService::postMore([
            ['uni', ''],
            ['paytype', '0'],
            ['from', 'weixin']
        ], $request, true);
        if (!$uni) $this->error('参数错误!');
        $order = LaveModel::where('cid', $this->cid)->where('order_id', $uni)->find();
        if (!$order)
            $this->error('订单不存在!');
        if ($order['paid'])
            $this->error('该订单已支付!');
        $order['pay_type'] = $paytype; //重新支付选择支付方式
        switch ($order['pay_type']) {
            case '0':
                try {
                    if ($from == 'routine') {
                        $jsConfig = LaveRepository::jsPay($this->cid, $order); //订单列表发起支付
                    } else if ($from == 'weixinh5') {
                        $jsConfig = LaveRepository::h5Pay($this->cid, $order);
                    } else {
                        $jsConfig = LaveRepository::wxPay($this->cid, $order);
                    }
                } catch (\Exception $e) {
                    $this->error($e->getMessage());
                }
                $this->success('获取成功', $jsConfig);
                break;
        }
        return $this->error('支付方式错误');
    }

//    支付中签约
    public function createSign(Request $request)
    {
//        var_dump(123);die();
        $where = UtilService::postMore(
            [
                ['cid', $this->cid],
                ['user_id', $this->auth->getUserinfo()['id']],
                ['order_name', ''],
                ['category_id', 0],
                ['amount', 0],
                ['name', ''],
                ['contact', ''],
                ['tel', 0],
                ['address', ''],
                ['is_open', '0'],
                ['is_ticket', '0'],
                ['pay_type', '0'],
                ['type', '0'],
                ['help_id', 0],
                ['from', 'weixin'],
            ], $request
        );
        $where1 = $where;
        unset($where1['from']);
        $where1['order_id'] = LaveModel::getNewOrderId();
        $where1['contract_code'] = WechatPlan::getNewCode();
        $contract_display_account = User::where('id', $where1['user_id'])->value('nickname');
        if (empty($contract_display_account)){
            $this->error('用户不存在!');
        }
        $where1['contract_display_account']=$contract_display_account;
        if (cache('lave_' . $where['user_id'])) $this->error('正在处理中');
        @file_put_contents("lave.txt", json_encode($where1));
        $order = LaveModel::create($where1);
        cache('lave_' . $where['user_id'], '1', 10);
        if (!$order) $this->error(LaveModel::getErrorInfo());
        $orderId = $order['order_id'];
        $info = compact('orderId');
        $order['plan_id'] = WechatPlan::where('cid', $where['cid'])->value('plan_id');
        if ($orderId) {
            $orderInfo = LaveModel::where('order_id', $orderId)->find();
            if (!$orderInfo || !isset($orderInfo['paid'])) $this->error('支付订单不存在!');
            if ($orderInfo['paid']) $this->error('支付已支付!');
//          创建签约
            $plan_record=[
                'plan_id'=>WechatPlan::where('price', $where['amount'])->value('plan_id'),
                'cid'=>$where['cid'],
                'uid'=>$where['user_id'],
                'price'=>$where['amount'],
                'is_signing'=>0,
                'contract_code'=>$where1['contract_code'],
                'contract_display_account'=>$where1['contract_display_account'],
                'is_open'=>$where1['is_open'],
            ];
            $record=WechatPlanRecord::create($plan_record);
            $plan_record['spbill_create_ip']=User::where('id', $where1['user_id'])->value('loginip');
            $plan_record['contract_notify_url']=Request::instance()->domain() . "/api/wechat/notify/" . $where['cid'];
            try {
                if ($where['from'] == 'routine') {
                    $jsConfig = LaveRepository::jsPaySign($this->cid, $orderId,$plan_record); //创建订单jspay
                } else if ($where['from'] == 'weixinh5') {
                    $jsConfig = LaveRepository::h5PaySign($this->cid, $orderId,$plan_record);
                } else {
                    $jsConfig = LaveRepository::wxPaySign($this->cid, $orderId,$plan_record);
                }
            } catch (\Exception $e) {
                return $this->error($e->getMessage());
            }
            $info['jsConfig'] = $jsConfig;

            return $this->success('订单创建成功', $info);

        } else $this->error(LaveModel::getErrorInfo());
    }
    /**
     * 签约订单支付
     * @param Request $request
     * @return mixed
     */
    public function paySign(Request $request)
    {
//        var_dump(456);die();
        list($uni, $paytype, $from) = UtilService::postMore([
            ['uni', ''],
            ['paytype', '0'],
            ['from', 'weixin']
        ], $request, true);
        if (!$uni) $this->error('参数错误!');
        $order = LaveModel::where('cid', $this->cid)->where('order_id', $uni)->find();
        if (!$order)
            $this->error('订单不存在!');
        if ($order['paid'])
            $this->error('该订单已支付!');
        $order['pay_type'] = $paytype; //重新支付选择支付方式
        switch ($order['pay_type']) {
            case '0':
                try {
                    if ($from == 'routine') {
                        $jsConfig = LaveRepository::jsPaySign($this->cid, $order); //订单列表发起支付
                    } else if ($from == 'weixinh5') {
                        $jsConfig = LaveRepository::h5PaySign($this->cid, $order);
                    } else {
                        $jsConfig = LaveRepository::wxPaySign($this->cid, $order);
                    }
                } catch (\Exception $e) {
                    $this->error($e->getMessage());
                }
                $this->success('获取成功', $jsConfig);
                break;
        }
        return $this->error('支付方式错误');
    }
    //    申请扣款
    public function payPap(Request $request)
    {
        @file_put_contents("quanju.txt", "测试申请扣款-\r\n", 8);
        die();
        $list=WechatPlanRecord::where('is_signing',0)->select();
        $cid=$this->cid;

        $arr=[];

        $arr['body']='月捐款';

        foreach ($list as $k => $v){
            $cid=$v['cid'];
            if ($this->querySign($cid,$v['uid'],$v['plan_id'],$v['contract_code'])){
                $arr['mch_id'] =Company::where('id', $cid)->value('pay_weixin_mchid');
                $arr['out_trade_no']=LaveModel::getNewOrderId();
                $arr['total_fee'] = $v['price'];
//            $arr['trade_type'] = 'PAP';
                $arr['contract_id'] = Company::where('id', $cid)->value('contract_id');
//            $rs = WechatService::paymentOrder($openid, $orderInfo['order_id'], $orderInfo['amount'], "lave", $orderInfo['order_name'], '', 'JSAPI', [], $cid);
                $rs = WechatService::papPayApply($arr['out_trade_no'], $arr['total_fee'], "lave", '月捐款', 'PAP', [], $cid,$arr['mch_id'],$arr['contract_id']);
                $where1['cid']=$cid;
                $where1['user_id']=$this->auth->getUserinfo()['id'];
                $where1['order_name']='月捐款';
                $where1['category_id']=81;
                $where1['amount']=$arr['total_fee'];
                $where1['name']=$this->auth->getUserinfo()['username'];
                $where1['contact']='';
                $where1['tel']=$this->auth->getUserinfo()['mobile'];
                $where1['address']='用户未填写联系地址';
                $where1['is_open']=$v['is_open'];
                $where1['is_ticket']='0';
                $where1['type']='0';
                $where1['help_id']='0';
                $order = LaveModel::create($where1);
            }
        }
    }
//    解除签约
    public function deleteSign(Request $request){
        $where = UtilService::postMore(
            [
                ['cid', $this->cid],
                ['user_id', $this->auth->getUserinfo()['id']],
            ], $request
        );
        $sign_info=WechatPlanRecord::where('cid', $where['cid'])->where('uid', $where['user_id'])->where('is_signing',1)->find();
        if (!$sign_info){
            $this->error('未找到签约信息!');
        }
        $mch_id =Company::where('id', $where['cid'])->value('pay_weixin_mchid');
        $plan_id=$sign_info['plan_id'];
        $contract_code=$sign_info['contract_code'];
//        $mch_id,$contract_code,$pan_id,$version='1.0',$options=[],$cid=0)
        $rs=WechatService::deleteSign($mch_id,$contract_code,$plan_id,'1.0',[],$where['cid']);
        @file_put_contents("quanju.txt", json_encode($rs)."-解除签约返回结果\r\n", 8);
        if ($rs){
            WechatPlanRecord::where('cid', $where['cid'])->where('uid', $where['user_id'])->where('is_signing',0)->update(['is_signing'=>1]);
            $this->success('解除签约成功!');
        }else{
            $this->error('解除签约失败!');
        }
    }
//    查询签约状态
    public function querySign(int $cid,int $uid,int $plan_id,string $contract_code)
    {
//        $where = UtilService::postMore(
//            [
//                ['cid', $this->cid],
//                ['user_id', $this->auth->getUserinfo()['id']],
//            ], $request
//        );
        $sign_info = WechatPlanRecord::where('cid', $cid)->where('uid', $uid)->where('is_signing', 1)->find();
        if (!$sign_info) {
            $this->error('未找到签约信息!');
        }
        $mch_id = Company::where('id', $cid)->value('pay_weixin_mchid');
//        $plan_id = $sign_info['plan_id'];
//        $contract_code = $sign_info['contract_code'];
        $rs = WechatService::querySign($mch_id, $contract_code, $plan_id);
        @file_put_contents("quanju.txt", json_encode($rs) . "-查询签约状态返回结果\r\n", 8);
        if ($rs['return_code'] == 'SUCCESS') {
            if ($rs['contract_state'] == 1) {
                WechatPlanRecord::where('cid',$cid)->where('uid', $uid)->where('is_signing', 1)->update(['is_signing' => 0]);
                return false;
            }else{
                WechatPlanRecord::where('cid',$cid)->where('uid', $uid)->where('is_signing', 1)->update(['contract_id' => $rs['contract_id']]);
                return true;
            }
        } else {
            $this->error('查询签约状态失败!');
        }
    }
    //    测试查询签约状态
    public function csquerySign(Request $request)
    {
        $where = UtilService::postMore(
            [
                ['cid', ''],
                ['user_id', ''],
                ['contract_code',''],
                ['plan_id', ''],
            ], $request
        );
//        $sign_info = WechatPlanRecord::where('cid', $cid)->where('uid', $uid)->where('is_signing', 1)->find();
//        if (!$sign_info) {
//            $this->error('未找到签约信息!');
//        }
        $mch_id = Company::where('id', $where['cid'])->value('pay_weixin_mchid');
//        $plan_id = $sign_info['plan_id'];
//        $contract_code = $sign_info['contract_code'];
        $rs = WechatService::querySign($mch_id, $where['contract_code'], $where['plan_id']);
        @file_put_contents("quanju.txt", json_encode($rs) . "-查询签约状态返回结果\r\n", 8);
//        if ($rs['return_code'] == 'SUCCESS') {
//            if ($rs['contract_state'] == 1) {
//                WechatPlanRecord::where('cid',$cid)->where('uid', $uid)->where('is_signing', 1)->update(['is_signing' => 0]);
//                return false;
//            }else{
//                WechatPlanRecord::where('cid',$cid)->where('uid', $uid)->where('is_signing', 1)->update(['contract_id' => $rs['contract_id']]);
//                return true;
//            }
//        } else {
//            $this->error('查询签约状态失败!');
//        }
    }
}

?>