<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/12/25
 * Time: 19:57
 */

namespace app\index\controller;


use app\index\model\CollocationModel;
use app\index\model\OrderInfoModel;
use app\index\model\OrderModel;
use app\index\model\OrderRenewModel;
use app\index\model\PayMethodModel;
use app\index\model\InsuranceCompanyModel;
use app\index\model\PageHtmlModel;
use app\index\model\SubjoinInsuranceModel;
use app\index\model\UserModel;
use app\index\server\FormServer;
use cmf\controller\WeChatBaseController;

use EasyWeChat\Foundation\Application;
use think\Db;
use think\Validate;

//我要托管
class FormController extends WeChatBaseController
{
    //授权
    function _initialize()
    {
        //判断用户是否微信浏览器打开
        $this->isWechat();
        //判断是否手机端
//        $this->isMobile();
        //微信授权
        parent::_initialize();
        $this->checkWeChatUserLogin();
        //阻止拉黑用户
        $this->ban();
    }
    //进入我要托管页面
    public function index(){
        $options = [
            'app_id' => config('wechat_config.app_id'),
            'secret' => config('wechat_config.secret'),
            'payment' => config('wechat_config.payment'),
        ];
        $app = new Application($options);
        $js = $app->js;
        $jssdk = $js->config(['chooseImage', 'uploadImage', 'previewImage'], $debug = false, $beta = false, $json = true);
        //判断用户是否注册手机号
        $isRegister = $this->isRegister();
        if(empty($isRegister)){
            return $this->redirect('user_register_mobile/index');//注册手机号页面
        }
        //判断用户是否填写问卷调查
        $isQuestion = $this->isQuestion();
        if(empty($isQuestion)){
            return $this->redirect('question/index');//问卷调查页面
        }
        $PageHtmlModel = new PageHtmlModel();
        $page_html1 = $PageHtmlModel->findData(array('id'=>2));//顶部图片
        $page_html2 = $PageHtmlModel->findData(array('id'=>3));//上传说明
        $InsuranceCompanyModel = new InsuranceCompanyModel();
        $insurance_company = $InsuranceCompanyModel->selectData();//保险公司
        $PayMethodModel = new PayMethodModel();
        $pay_method = $PayMethodModel->selectData();//缴费方式
        $this->assign(
            array(
                'jssdk'=>$jssdk,
                'page_html1'=>$page_html1,
                'page_html2'=>$page_html2,
                'insurance_company'=>$insurance_company,
                'pay_method'=>$pay_method,
            )
        );
        return $this->fetch();
    }
    //创建保险
    public function add_post(){
        $user_id = cmf_get_current_user_id();
        $param = $this->request->param();
        //主险
        $validate = new Validate([
            'insurance_company_id' => 'require',
            'product_name' => 'require',
            'insurance_type_id' => 'require',
            'insurance_price' => 'require',
//            'payment_time_type' => 'require',
            'payment_time' => 'require',
            'pay_method_id' => 'require',
            'pay_method_price' => 'require',
            'guarantee_deadline_time' => 'require',
            'insurance_num' => 'require',
            'application' => 'require',
            'insurer' => 'require',
            'relation' => 'require',
            'insurer_birthday' => 'require',
            'insurer_time' => 'require',
            'take_time' => 'require',
//            'insure_time' => 'require',
            'remit' => 'require',
            'recommend' => 'require',
        ]);
        $validate->message([
            'insurance_company_id' => '请选择保险公司!',
            'product_name' => '产品名称不能为空!',
            'insurance_type_id' => '请选择保险类型!',
            'insurance_price' => '保险金额不能为空!',
//            'payment_time_type' => '请选择缴费期限类型!',
            'payment_time' => '请选择缴费期限!',
            'pay_method_id' => '缴费方式不能为空!',
            'pay_method_price' => '期缴保费不能为空!',
            'guarantee_deadline_time' => '请选择保障期限!',
            'insurance_num' => '保险单号不能为空!',
            'application' => '投保人不能为空!',
            'insurer' => '被保人不能为空!',
            'relation' => '与被保人关系!',
            'insurer_birthday' => '请选择被保人生日!',
            'insurer_time' => '请选择投保日期!',
            'take_time' => '请选择合同生效日期!',
//            'insure_time' => '请选择保险时间!',
            'remit' => '请选择投保人豁免!',
            'recommend' => '请选择平台是否推荐!'
        ]);
        if (!$validate->check($param)) {
            $this->error($validate->getError());
        }
        $images = [];
        if(!empty($param['imgs'])){

            $images = explode(',',$param['imgs']);
        }
        $array1 = [
            'insurance_company_id' => $param['insurance_company_id'],
            'product_name' => $param['product_name'],
            'insurance_type_id' => $param['insurance_type_id'],
            'insurance_price' => $param['insurance_price'],
//            'payment_time_type' => $param['payment_time_type'],
//            'payment_time_id' => $param['payment_time_id'] ? $param['payment_time_id'] : null,
            'payment_time' => $param['payment_time'] ? $param['payment_time'] : null,
            'pay_method_id' => $param['pay_method_id'],
            'pay_method_price' => $param['pay_method_price'],
            'guarantee_deadline_time' => $param['guarantee_deadline_time'],
            'insurance_num' => $param['insurance_num'],
            'application' => $param['application'],
            'insurer' => $param['insurer'],
            'relation' => $param['relation'],
            'insurer_birthday' => $param['insurer_birthday'],
            'insurer_time' => strtotime($param['insurer_time']),
            'take_time' => strtotime($param['take_time']),
//            'insure_time' => $param['insure_time'],
            'remit' => $param['remit'],
            'remark' => !empty($param['remark']) ? $param['remark'] : null,
            'agent_name' => !empty($param['agent_name']) ? $param['agent_name'] : null,
            'agent_phone' => !empty($param['agent_phone']) ? $param['agent_phone'] : null,
            'create_time' => time(),
            'expire_time' => strtotime($param['take_time'])+$param['payment_time']*365*24*60*60,
            'user_id' => $user_id,
            'image' => !empty($images) ? json_encode($images) : null,
            'recommend' => $param['recommend'],
        ];
        //开启事务
        Db::startTrans();
        $result1 = Db::name('collocation')->insertGetId($array1);
        if(empty($result1)){
            Db::rollback();
            $arr['code'] = 40000;
            $arr['msg'] = "主险添加失败!";
            return json_encode($arr);
        }
        //附加险
        if(!empty($param['subjoin_product_name_arr'])){
            $param['subjoin_insurance_type_id_arr'] = explode(',',$param['subjoin_insurance_type_id_arr']);
            $param['subjoin_product_name_arr'] = explode(',',$param['subjoin_product_name_arr']);
            $param['subjoin_price_arr'] = explode(',',$param['subjoin_price_arr']);
            //$param['subjoin_time_arr'] = explode(',',$param['subjoin_time_arr']);
            $param['payment_time_arr'] = explode(',',$param['payment_time_arr']);
            $param['subjoin_pay_method_price_arr'] = explode(',',$param['subjoin_pay_method_price_arr']);
            $param['subjoin_guarantee_deadline_time_arr'] = explode(',',$param['subjoin_guarantee_deadline_time_arr']);
            $array2 = [];
            foreach($param['subjoin_product_name_arr'] as $key => $value){
                $data = [
                    'subjoin_product_name' => $value,
                    'insurance_type_id' => $param['subjoin_insurance_type_id_arr'][$key] ? $param['subjoin_insurance_type_id_arr'][$key] : null,
                    'subjoin_price' => $param['subjoin_price_arr'][$key] ? $param['subjoin_price_arr'][$key] : null,
//                    'subjoin_time' => $param['subjoin_time_arr'][$key] ? $param['subjoin_time_arr'][$key] : null,
                    'payment_time' => $param['payment_time_arr'][$key] ? $param['payment_time_arr'][$key] : null,
                    'subjoin_pay_method_price' => $param['subjoin_pay_method_price_arr'][$key] ? $param['subjoin_pay_method_price_arr'][$key] : null,
                    'subjoin_guarantee_deadline_time'=>$param['subjoin_guarantee_deadline_time_arr'][$key] ? $param['subjoin_guarantee_deadline_time_arr'][$key] : null,
                    'user_id' => $user_id,
                    'collocation_id' => $result1,
                    'create_time' => time(),
                ];
                array_push($array2, $data);
            }
            $result2 = Db::name('subjoin_insurance')->insertAll($array2);
            if(empty($result2)){
                Db::rollback();
                $arr['code'] = 40000;
                $arr['msg'] = "附加险添加失败!";
            }
        }
        Db::commit();
        $arr['code'] = 20000;
        $arr['msg'] = "附加险添加成功!";
        $arr['data'] = $result1;
        return json_encode($arr);

    }
    public function edit(){
        $options = [
            'app_id' => config('wechat_config.app_id'),
            'secret' => config('wechat_config.secret'),
            'payment' => config('wechat_config.payment'),
        ];
        $app = new Application($options);
        $js = $app->js;
        $jssdk = $js->config(['chooseImage', 'uploadImage', 'previewImage'], $debug = false, $beta = false, $json = true);
        $id = $this->request->param('id');
        $user_id = cmf_get_current_user_id();
        $collocationModel = new CollocationModel();
        $data = $collocationModel->findData(array('c.id'=>$id,'c.user_id'=>$user_id));
        $subjoinInsuranceModel = new SubjoinInsuranceModel();
        $subjoin = $subjoinInsuranceModel->selectData2(array('collocation_id'=>$data['id']));
        $PageHtmlModel = new PageHtmlModel();
        $page_html2 = $PageHtmlModel->findData(array('id'=>3));//上传说明
        $InsuranceCompanyModel = new InsuranceCompanyModel();
        $insurance_company = $InsuranceCompanyModel->selectData();//保险公司
        $PayMethodModel = new PayMethodModel();
        $pay_method = $PayMethodModel->selectData();//缴费方式
        $this->assign(
            array(
                'data'=>$data,
                'page_html2'=>$page_html2,
                'insurance_company'=>$insurance_company,
                'pay_method'=>$pay_method,
                'jssdk'=>$jssdk,
                'subjoin'=>$subjoin,
            )
        );
        return $this->fetch();
    }
    //更改订单
    public function edit_post(){
        $user_id = cmf_get_current_user_id();
        $param = $this->request->param();
        //清空所有该主险下的附加险
        $subjoinInsuranceModel = new SubjoinInsuranceModel();
        $subjoinInsuranceModel->deleteData(array('collocation_id'=>$param['id'],'user_id'=>$user_id));
        $array1 = [
            'insurance_company_id' => $param['insurance_company_id'],
            'product_name' => $param['product_name'],
            'insurance_type_id' => $param['insurance_type_id'],
            'insurance_price' => $param['insurance_price'],
            'payment_time' => $param['payment_time'] ? $param['payment_time'] : null,
            'pay_method_id' => $param['pay_method_id'],
            'pay_method_price' => $param['pay_method_price'],
            'guarantee_deadline_time' => $param['guarantee_deadline_time'],
            'insurance_num' => $param['insurance_num'],
            'application' => $param['application'],
            'insurer' => $param['insurer'],
            'relation' => $param['relation'],
            'insurer_birthday' => $param['insurer_birthday'],
            'insurer_time' => strtotime($param['insurer_time']),
            'take_time' => strtotime($param['take_time']),
//            'insure_time' => $param['insure_time'],
            'remit' => $param['remit'],
            'remark' => !empty($param['remark']) ? $param['remark'] : null,
            'agent_name' => !empty($param['agent_name']) ? $param['agent_name'] : null,
            'agent_phone' => !empty($param['agent_phone']) ? $param['agent_phone'] : null,
            'expire_time' => strtotime($param['take_time'])+$param['payment_time']*365*24*60*60,
            'image' => !empty($param['imgs']) ? json_encode($param['imgs']) : null,
        ];
        //更新主险
        $result1 = Db::name('collocation')->where(array('user_id'=>$user_id,'id'=>$param['id']))->update($array1);
        //新增附加险
        if(!empty($param['subjoin_product_name_arr'])){
            $array2 = [];
            foreach($param['subjoin_product_name_arr'] as $key => $value){
                $data = [
                    'subjoin_product_name' => $value,
                    'insurance_type_id' => $param['subjoin_insurance_type_id_arr'][$key] ? $param['subjoin_insurance_type_id_arr'][$key] : null,
                    'subjoin_price' => $param['subjoin_price_arr'][$key] ? $param['subjoin_price_arr'][$key] : null,
                    //'subjoin_time' => $param['subjoin_time_arr'][$key] ? $param['subjoin_time_arr'][$key] : null,
                    'payment_time' => $param['payment_time_arr'][$key] ? $param['payment_time_arr'][$key] : null,
                    'subjoin_pay_method_price' => $param['subjoin_pay_method_price_arr'][$key] ? $param['subjoin_pay_method_price_arr'][$key] : null,
                    'subjoin_guarantee_deadline_time'=>$param['subjoin_guarantee_deadline_time_arr'][$key] ? $param['subjoin_guarantee_deadline_time_arr'][$key] : null,
                    'user_id' => $user_id,
                    'collocation_id' => $param['id'],
                    'create_time' => time(),
                ];
                array_push($array2, $data);
                $result2 = Db::name('subjoin_insurance')->insertAll($array2);
            }
        }
        $send = Db::name('send')->where(array('user_id'=>$user_id,'collocation_id'=>$param['id']))->find();
        Db::name('send')->where(array('user_id'=>$user_id,'collocation_id'=>$param['id']))->delete();
        $data4 = [];
        $payment_time = $param['payment_time'];
        for($i=0;$i<$payment_time;$i++){
            if($array1['expire_time']-($i*365*24*60*60)-(30*24*60*60)>time()){
                $data3['user_id'] = $user_id;
                $data3['order_id'] = $send['order_id'];
                $data3['collocation_id'] = $param['id'];
                $data3['time'] = $array1['expire_time']-($i*365*24*60*60)-(30*24*60*60);
                $data4[] = $data3;
            }else{
                $data3['time'] = $param['payment_time'];
                $data4[] = $data3;
            }
        }
        $array3 = array('order_expire_time'=>$array1['expire_time'],'order_about_time'=>$data4[count($data4)-1]['time']);
        $a = Db::name('order')->where(array('collocation_id'=>$param['id'],'user_id'=>$user_id))->update($array3);
        $arr['code'] = 20000;
        $arr['msg'] = '更新成功!';
        return json_encode($arr);
    }
    //保单详情页
    public function info(){
        $param = $this->request->param();
        $collocationModel = new CollocationModel();
        //主险
        $data = $collocationModel->findData(array('id'=>$param['id']));
        $formServer = new FormServer();
        //附加险
        $data = $formServer->getSubjoinInsurance($data);
        $this->assign(
            array(
                'data'=>$data,
            )
        );
    }
    //创建订单
    public function create_order(){
        $user_id = cmf_get_current_user_id();
        $param = $this->request->param();
        if($param['type'] == 1){
            //免费
            $data1['status'] = 1;
        }else if($param['type'] == 2){
            //付费
            $data1['status'] = 2;
        }else{
            $data1['status'] = [];
            $this->error('参数错误!','');
        }
        $collocationModel = new CollocationModel();
        if($data1['status'] == 2){
            //判断是否需要再付费
            //支付逻辑:支付一次可以添加20张保单,10个不相同的被保险人
            $order_num = Db::name('order_num')->where('user_id',$user_id)->count();
            $count_order = $this->count_order();
            $insurer = $collocationModel->insurerData(array('user_id'=>$user_id),"insurer");

            if(empty($order_num)){
                $data1['status'] = 2;
            }else{
                if($count_order >= $order_num*20 || count($insurer) > $order_num*10){
                    $data1['status'] = 2;
                }else{
                    //不需付费
                    $data1['status'] = 3;
                }
            }
        }
        $total = Db::name('total')->where('id',1)->find();
        $collocation = $collocationModel->findData(array('c.id'=>$param['collocation_id']));
        $data1['num'] = cmf_get_order_sn();
        $data1['user_id'] = $user_id;
        $data1['collocation_id'] = $param['collocation_id'];
        $data1['total'] = $total['total'];
        $data1['create_time'] = time();
        if($data1['status'] == 1 || $data1['status'] == 3){
            $data1['order_expire_time'] = $collocation['expire_time'];
            $data1['order_about_time'] = $collocation['expire_time']-30*24*60*60;
        }else{
            $data1['order_about_time'] = null;
        }
        $orderModel = new OrderModel();
        //开启事务
        $orderModel->startTrans();
        $result1 = $orderModel->insertData($data1);
        if(empty($result1)){
            //回滚
            $orderModel->rollback();
            $arr['code'] = 40000;
            $arr['msg'] = '主订单表添加失败!';
            return json_encode($arr);
        }
        $data2['order_id'] = $result1;
        $data2['collocation_id'] = $param['collocation_id'];
        $data2['create_time'] = time();
        $orderInfoModel = new OrderInfoModel();
        $result2 = $orderInfoModel->insertData($data2);
        if(empty($result2)){
            //回滚
            $orderModel->rollback();
            $arr['code'] = 40000;
            $arr['msg'] = '副订单表添加失败!';
            return json_encode($arr);
        }
        //添加消息发送
        if($data1['status'] == 1 || $data1['status'] == 3) {
            $data4 = [];
            $payment_time = $collocation['payment_time'];
            for($i=0;$i<$payment_time;$i++){
                if($collocation['expire_time']-($i*365*24*60*60)-(30*24*60*60)>time()){
                    $data3['user_id'] = $user_id;
                    $data3['order_id'] = $result1;
                    $data3['collocation_id'] = $collocation['id'];
                    $data3['time'] = $collocation['expire_time']-($i*365*24*60*60)-(30*24*60*60);
                    $data4[] = $data3;
                }else{
                    $data3['time'] = $collocation['expire_time']-(30*24*60*60);
                    $data4[] = $data3;
                }
            }
            Db::name('send')->insertAll($data4);
            $update['order_expire_time']=$collocation['expire_time'];
            $update['order_about_time']=$data4[count($data4)-1]['time'];
            $update['order_expire_time2']=time()+(365*24*60*60);
            Db::name('order')->where('id',$result1)->update($update);
        }
        $orderModel->commit();
        //推送模板消息
        if($data1['status'] == 1 || $data1['status'] == 3){
            $templateId = 'rQSM5XqM4cJEua6nsJC4IGuLfIOYvkNOVKVABILc8Ro';
            $data2 = array(
                'first'=>"尊敬的用户,您的保单即将生效",
                'keyword1'=>$collocation['insurance_num'],
                'keyword2'=>$collocation['product_name'],
                'keyword3'=>$collocation['insurer'],
                'keyword4'=>date('Y-m-d',$collocation['take_time'])."至".date('Y-m-d',$collocation['expire_time']),
                'remark'=>"立即查看保单详情",
            );
            $url = url('me_guarantee/guarantee_info',array('id'=>$result2),'',true);
            $user1 = Db::name('third_party_user')->where('user_id',$collocation['user_id'])->find();
            $user = Db::name('user')->where('id',$user_id)->find();
            $this->template($templateId,$data2,$url,$user1['openid']);
            //短信通知
            $data = array(
                'content' 	=> "【橙象保险】尊敬的用户您的保单即将生效,保单号为$collocation[insurance_num]。",//短信内容
                'mobile' 	=> $user['mobile'],//手机号码
                'productid' => '887361',//产品id
                'xh'		=> ''//小号
            );
            $result = send_sms($data);
            if(substr($result,0,strpos($result,',')) != "1"){
                $arr['code'] = 40000;
                $arr['msg'] = '短信接口出错';
                return json_encode($arr);
            }
        }
        $arr['code'] = 20000;
        $arr['msg'] = '操作成功!';
        $arr['data'] = $result1;//返回主订单id
        $arr['status'] = $data1['status'];
        return json_encode($arr);
    }
    //创建续费订单
    public function create_order_renew(){
        $user_id = cmf_get_current_user_id();
        $param = $this->request->param();
        //查询当前订单号
        $orderInfoModel = new OrderInfoModel();
        $order_info = $orderInfoModel->findData2(array('collocation_id'=>$param['id']));
        if(empty($order_info)){
            $arr['code'] = 40000;
            $arr['msg'] = "未查询到订单";
            return json_encode($arr);
        }
        //判断当前订单是否为当收费
        $orderModel = new OrderModel();
        $order = $orderModel->findData(array('id'=>$order_info['order_id'],'user_id'=>$user_id));
        if(empty($order)){
            $arr['code'] = 40000;
            $arr['msg'] = '未查询到当前订单!';
            return json_encode($arr);
        }
        if($order['status'] == 1){
            $arr['code'] = 20001;
            $arr['msg'] = '当前订单为免费!';
            return json_encode($arr);
        }
        $total = Db::name('total')->where('id',2)->find();
        $data['num'] = cmf_get_order_sn();
        $data['user_id'] = $user_id;
        $data['total'] = $total['total'];
        $data['status'] = 1;
        $data['order_id'] = $order['id'];
        $data['create_time'] = time();
        $orderRenewModel = new OrderRenewModel();
        $result = $orderRenewModel->insertData($data);
        if(empty($result)){
            $arr['code'] = 40000;
            $arr['msg'] = '创建续费订单失败!';
            return json_encode($arr);
        }
        $arr['code'] = 20000;
        $arr['msg'] = '创建续费订单成功';
        $arr['data'] = $result;
        return json_encode($arr);
    }
    //进入下单页面
    public function cost(){
        $user_id = cmf_get_current_user_id();
        $userModel = new UserModel();
        $user = $userModel->findUserData(array('id'=>$user_id));
        $param = $this->request->param();
        $param['imgs'] = str_replace('*', '/', $param['imgs']);
        if($param['insurer'] == $user['name']){
            //显示免费
            $type = 1;
        }else{
            //只显示付费
            $type = 2;
        }
        $pageHtmlModel = new PageHtmlModel();
        $page_html1 = $pageHtmlModel->findData(array('id'=>5));
        $page_html2 = $pageHtmlModel->findData(array('id'=>6));
        $this->assign(
            array(
                'type'=>$type,
                'param'=>$param,
                'page_html1'=>$page_html1,
                'page_html2'=>$page_html2,
            )
        );
        return $this->fetch();
    }
    //获取一个用户有多少个保单
    public function count_order(){
        $user_id = cmf_get_current_user_id();
        $where['user_id'] = ['eq',$user_id];
        $where['status'] = ['eq',3];
        $result = Db::name('order')->where($where)->count();
        return $result;
    }
}