<?php

namespace app\api\controller;

use app\admin\model\Company;
use app\admin\model\LaveMonth;
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 app\common\model\LaveMonth as LaveMonthModel;
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']],
//                ['user_id', 0],
                ['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],
                ['plan_id', 0],
                ['from', 'weixin'],
            ], $request
        );
        if (!$this->auth->isLogin()) {
            $this->error(__('Please login first'), null, 401);
        }
        $where['user_id']=$this->auth->getUserinfo()['id'];
        $where1 = $where;
        unset($where1['from']);
        $where1['order_id'] = LaveMonthModel::getNewOrderId();
//        $contract_display_account = User::where('id', $where1['user_id'])->value('nickname');
//        if (empty($contract_display_account)){
//            $this->error('用户不存在!');
//        }
        if ($where['amount'] > 500) {
            $this->error('捐款金额不能大于500');
        }
        $sign = WechatPlanRecord::where('uid', $where1['user_id'])->where('plan_id', $where1['plan_id'])->where('is_signing', 0)->find();
        if (!empty($sign)) {
            $this->error('您已签约，请勿重复签约!');
        }
        if (cache('lave_' . $where['user_id'])) $this->error('正在处理中');
        $plan_id = $where1['plan_id'];
        @file_put_contents("quanju.txt", $plan_id . "-签约模版编号\r\n", 8);
//        unset($where1['plan_id']);
        $where1['contract_code'] = WechatPlanRecord::getNewCode();
        $order = LaveMonthModel::create($where1);
        $where1['contract_display_account'] = $where1['name'];
        cache('lave_' . $where['user_id'], '1', 10);
        if (!$order) $this->error(LaveMonthModel::getErrorInfo());
        $orderId = $order['order_id'];
        $info = compact('orderId');
        $order['plan_id'] = $plan_id;
        if ($orderId) {
            $orderInfo = LaveMonthModel::where('order_id', $orderId)->find();
            if (!$orderInfo || !isset($orderInfo['paid'])) {
                $this->error('支付订单不存在!');
            }
            if ($orderInfo['paid']) $this->error('支付已支付!');
//          创建签约
            $plan_record = [
                'plan_id' => $plan_id,
                'cid' => $where['cid'],
                'uid' => $where['user_id'],
                'price' => $where['amount'],
                'is_signing' => 2,
                'contract_code' => $where1['contract_code'],
                'contract_display_account' => $where1['contract_display_account'],
                'is_open' => $where1['is_open'],
                'tel' => $where1['tel'],
//                'category_id'=>$where1['category_id'],
                'order_name' => $where1['order_name'],
            ];
            $count = WechatPlanRecord::where('uid', $where1['user_id'])->where('plan_id', $plan_id)->count();
            $record = WechatPlanRecord::create($plan_record);
            @file_put_contents("quanju.txt", json_encode($record) . "-签约模版记录\r\n", 8);
            LaveMonthModel::where('order_id', $orderId)->update(['record_id' => $record['id']]);
            $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;
//            增加参与人数

//            @file_put_contents("quanju.txt", $count."-参与次数\r\n", 8);
            if ($count == 0) {
                $num = WechatPlan::where('plan_id', $plan_id)->value('num');
//                @file_put_contents("quanju.txt", $num."-参与人数\r\n", 8);
                WechatPlan::where('plan_id', $plan_id)->update(['num' => $num + 1]);
            }
            return $this->success('订单创建成功', $info);

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

    //    申请扣款
    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) {
            $day = intval(date('d', $v['createtime']));
            $date = date('Y-m', $v['createtime']);
            $last = intval(date("t", time())); //当月最后一天
//            @file_put_contents("quanju.txt", $day."-日期\r\n", 8);
            $today = intval(date('d'));
            $now_date = date('Y-m', time());
            $tf = false;
            if ($day == 1 && $today == $last) { //签约时间是第一天，且今天是这个月的最后一天
                $tf = true;
            }
            if ($day - 1 > $last && $today == $last) {  //签约时间的前一天日期依然比这个月的最后一天大，且今天是这个月的最后一天
                $tf = true;
            }
            if ($date != $now_date) {  //先确定月份不同

                if ($today == $day - 1 || $tf) { //再确定是不是今天是不是签约日期的前一天
//                 var_dump(789456132);die();
                    @file_put_contents("quanju.txt", json_encode($v)."-月捐数据\r\n", 8);
                    $cid = $v['cid'];
                    $mch_id = Company::where('id', $cid)->value('pay_weixin_mchid');
                    $where1['cid'] = $cid;
                    $where1['user_id'] = $v['uid'];
                    $where1['order_name'] = $v['order_name'];
                    $where1['order_id'] = LaveMonthModel::getNewOrderId();;

//                $where1['category_id']=$v['category_id'];
                    $where1['amount'] = $v['price'];
                    $where1['name'] = $v['contract_display_account'];
                    $where1['contact'] = '';
                    $where1['tel'] = $v['tel'];
                    $where1['address'] = '用户未填写联系地址';
                    $where1['is_open'] = $v['is_open'];
                    $where1['is_ticket'] = '0';
                    $where1['type'] = '0';
                    $where1['record_id'] = $v['id'];
                    $where1['contract_code'] = $v['contract_code'];
                    $where1['plan_id'] = $v['plan_id'];

                    $where1['nonce_str'] = uniqid();
//                $where1['help_id']='0';
//                    @file_put_contents("quanju.txt", json_encode($where1)."测试申请扣款-\r\n", 8);
                    $order = LaveMonthModel::create($where1);
//            }
//                    var_dump(988745613);die();
                    $rs = WechatService::papPayApply($mch_id, $where1['order_id'], $where1['amount'], "lave", '月捐款', 'PAP', [], $cid, $v['contract_id'], $where1['order_name'], $where1['nonce_str']);
                    @file_put_contents("quanju.txt", json_encode($rs)."-月捐汇报\r\n", 8);
                }
            }
        }
//            die();

//        }
    }
//    检查签约用户是否有符合签约月份数量的扣款记录
    public function check_pay_pap(){
        $list = WechatPlanRecord::where('is_signing', 0)->select();  //签约中
        foreach ($list as $k => $v) {
//            查找对应签约协议号的月捐记录
            $count = LaveMonthModel::where('contract_code', $v['contract_code'])->count();
            $createDate = new \DateTime('@'.$v['createtime']);
            $currentDate = new \DateTime();
            $interval = $currentDate->diff($createDate);
            $monthsDiff = $interval->y * 12 + $interval->m;
            if ($interval->d > 0) {
                $monthsDiff += $interval->d / $currentDate->format('t');
            }
            $monthsDiff = floor($monthsDiff);
            @file_put_contents("quanju2.txt", $v['contract_code']."签约协议号-\r\n", 8);
            @file_put_contents("quanju2.txt", $monthsDiff."相差月份-\r\n", 8);
            @file_put_contents("quanju2.txt", $count."统计次数-\r\n", 8);
//            if ($monthsDiff > $count) {  //相差月数大于月捐记录数量
//                $cid = $v['cid'];
//                $mch_id = Company::where('id', $cid)->value('pay_weixin_mchid');
//                $where1['cid'] = $cid;
//                $where1['user_id'] = $v['uid'];
//                $where1['order_name'] = $v['order_name'];
//                $where1['order_id'] = LaveMonthModel::getNewOrderId();;
//
////                $where1['category_id']=$v['category_id'];
//                $where1['amount'] = $v['price'];
//                $where1['name'] = $v['contract_display_account'];
//                $where1['contact'] = '';
//                $where1['tel'] = $v['tel'];
//                $where1['address'] = '用户未填写联系地址';
//                $where1['is_open'] = $v['is_open'];
//                $where1['is_ticket'] = '0';
//                $where1['type'] = '0';
//                $where1['record_id'] = $v['id'];
//                $where1['contract_code'] = $v['contract_code'];
//                $where1['plan_id'] = $v['plan_id'];
//
//                $where1['nonce_str'] = uniqid();
////                $where1['help_id']='0';
////                    @file_put_contents("quanju.txt", json_encode($where1)."测试申请扣款-\r\n", 8);
////                $order = LaveMonthModel::create($where1);
////            }
////                    var_dump(988745613);die();
////                $rs = WechatService::papPayApply($mch_id, $where1['order_id'], $where1['amount'], "lave", '月捐款', 'PAP', [], $cid, $v['contract_id'], $where1['order_name'], $where1['nonce_str']);
////                @file_put_contents("quanju.txt", json_encode($rs)."-月捐汇报2\r\n", 8);
//            }
        }
        $this->success('获取成功');
    }

//    解除签约
    public function deleteSign(Request $request)
    {
        $where = UtilService::postMore(
            [
                ['id', 0],
                ['cid', $this->cid],
                ['user_id', $this->auth->getUserinfo()['id']],
            ], $request
        );
        if ($where['id'] == 0) {
            $sign_info = WechatPlanRecord::where('cid', $where['cid'])->where('uid', $where['user_id'])->where('is_signing', 0)->find();
        } else {
            $sign_info = WechatPlanRecord::where('id', $where['id'])->where('is_signing', 0)->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);
        $this->success('解除签约成功!');
//        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 plan_lst(Request $request)
    {
        $where = UtilService::getMore(
            [
                ['page', 1],
                ['limit', 10],
                ['cid', $this->cid],
//                ['paid', 1],
//                ['category_id', 0],
//                ['order', ''],
//                ['key', ''],
            ], $request
        );
        $this->success('获取成功', WechatPlan::lst($where));
    }

    public function plan_read(Request $request)
    {
        $where = UtilService::getMore(
            [
                ['id', 0],
                ['cid', $this->cid],
            ], $request
        );
        @file_put_contents("quanju.txt", $where['cid']."-cid是多少\r\n", 8);
        if (!$where['id']) $this->error('参数错误');
        $this->success('获取成功', WechatPlan::read($where));
    }

//    签约列表
    public function user_plan_lst(Request $request)
    {
        $where = UtilService::getMore(
            [
//                ['cid', 0],
                ['cid', $this->cid],
                ['uid', $this->auth->getUserinfo()['id']],
//                ['uid', 0],
            ], $request
        );
        if (!isset($where['uid'])) $this->error('用户不存在');
        if (!isset($where['cid'])) $this->error('请选择正确的城市的红十字会');
        $this->success('获取成功', WechatPlanRecord::record_lst($where));
    }

//    签约记录详情
    public function user_record_info(Request $request)
    {
        $where = UtilService::getMore(
            [
                ['id', 0],
//                ['cid', 0],
                ['cid', $this->cid],
                ['user_id', $this->auth->getUserinfo()['id']],
//                ['user_id', 0],
            ], $request
        );
        $this->success('获取成功', WechatPlanRecord::record_info($where));
    }
    //    签约记录详情
    public function query_sign_order(Request $request)
    {
        $where = UtilService::getMore(
            [
                ['order_id', 0],
                ['cid', 0],
            ], $request
        );
        $this->success('获取成功', WechatService::querySignOrder($where['order_id'],$where['cid']));
    }
//
    public function day_query_sign_order(Request $request)
    {
//        改成搜索三天内的未支付订单
        $threeDaysAgo = strtotime('-3 days');
        @file_put_contents("quanju2.txt", $threeDaysAgo . "-三天前时间戳\r\n", 8);
        $list = LaveMonth::where('paid',0)->where('cid', '>',1)->where('createtime','>', $threeDaysAgo)->select();
        foreach ($list as $k => $v) {
           WechatService::querySignOrder($v['order_id'],$v['cid']);
        }
        $this->success('修改成功!');
    }
    public function querycontract(Request $request)
    {
        $where = UtilService::getMore(
            [
                ['contract_id', 0],
                ['cid', 0],
            ], $request
        );
        $mch_id = Company::where('id', $where['cid'])->value('pay_weixin_mchid');
        $this->success('获取成功', WechatService::querycontract($mch_id,$where['contract_id'],'1.0',[],$where['cid']));
    }
}

?>