<?php

namespace app\api\controller;

use app\common\controller\Api;
use think\Db;
/**
 * 售课
 */
class Lesson extends Api
{
    // 无需登录的接口,*表示全部
    protected $noNeedLogin = [];
    // 无需鉴权的接口,*表示全部
    protected $noNeedRight = ['*'];

    //售课列表
    public function lists(){

        $list = Db::name('lesson')->where('is_show',1)->order('weigh asc')->autopage()->select();
        $list = list_domain_image($list,['image']);
        $list = $this->list_lang($list,['name','title','info','shiherenqun','pingjunrenshu','sirenkecheng','daoshi']);

        $this->success(1,$list);
    }

    //售课分类列表
    public function lesson_cate(){
        $result = [
            ['id'=>0,'name'=>'全部','name_en'=>'ALL']
        ];

        $list = Db::name('lesson_cate')->order('id asc')->select();
        foreach($list as $key => $val){
            $result[] = $val;
        }

        $result = $this->list_lang($result,['name']);

        $this->success(1,$result);
    }

    //日历列表

    //教练列表
    public function coach_list(){
        $list = Db::name('coach')->field('id,nickname,avatar')->where('status',1)->order('nickname asc')->select();
        $list = list_domain_image($list,['avatar']);
        $this->success(1,$list);
    }

    //课时列表首页
    //根据年,月获取当月剩余日期,有课程的标记1
    public function slot_index(){

        $getdate = input('date',date('Y-m'));
        if(empty($getdate)){
            $getdate = date('Y-m');
        }
        $year = substr($getdate,0,4);
        $month = substr($getdate,-2,2);

        //今天是哪日
        if($year == date('Y') && $month == date('m')){
            //如果是今年今月,默认今天开始
            $startday = date('d');
        }else{
            //从1号开始
            $startday = '01';
        }

        //所有课程点进来的 额外传参
        $lesson_id = input('lesson_id',0);
        if($lesson_id){
            $first_starttime = Db::name('lesson_slot')->where('lesson_id',$lesson_id)->where('status',0)->where('starttime','gt',time())->where('is_show',1)->order('starttime asc')->value('starttime');
    //        $first_startdate = date('Y-m-d H:i:s',$first_starttime);dump($first_startdate);exit;
            if($first_starttime){
                $year = date('Y',$first_starttime);
                $month = date('m',$first_starttime);
                $startday = date('d',$first_starttime);
            }
        }

        //一周
        $week_arr = [
            1 => '周一',
            2 => '周二',
            3 => '周三',
            4 => '周四',
            5 => '周五',
            6 => '周六',
            7 => '周日',
        ];
        //本月结束日
        $endday_arr = [
            '01' => 31,
            '02' => 28,
            '03' => 31,
            '04' => 30,
            '05' => 31,
            '06' => 30,
            '07' => 31,
            '08' => 31,
            '09' => 30,
            '10' => 31,
            '11' => 30,
            '12' => 31,
        ];
        if($year%4 == 0){
            $endday_arr['02'] = 29;
        }
        $endday = $endday_arr[$month];

        //拿数据
        $startdate = $getdate.'-'.$startday;
        $enddate   = $getdate.'-'.$endday;
        $where = [
            'starttime' => ['BETWEEN',[strtotime($startdate),strtotime($enddate)+86399]],
            'status'    => 0,
            'is_show' => 1,

        ];
        //dump($where);exit;
        $slots = Db::name('lesson_slot')->where($where)->field('id,starttime')->select();

        $date_arr = [];
        for($i=intval($startday);$i<=$endday;$i++){

            $j = $i;
            if($j < 10){
                $j = 0 . $j;
            }
            $idate = $year.'-'.$month.'-'.$j;

            $itime = strtotime($idate);

            $week = $this->lang == 'en' ? date('D',$itime) : $week_arr[date('N',$itime)];

            $i_data = [
                'yeah' =>$year,
                'month'=>$month,
                'day'  => $j.'',
                'date' => $idate,
                'week' => $week,
                'is_today' => 0,
                'slot_num' => 0,
                'date_show'=> $this->lang == 'en' ? $j.'.'.$month : $month.'.'.$j,
            ];

            foreach($slots as $slot){
                if(date('Y-m-d',$slot['starttime']) == $idate)
                {
                    $i_data['slot_num'] += 1;
                }
            }

            if($idate == date('Y-m-d')){
                $i_data['is_today'] = 1;
            }

            $date_arr[] = $i_data;
        }

        $this->success(1,$date_arr);
    }

    //某日课时列表
    public function slot_list(){

        $date = strtotime(input('date',date('Y-m-d')));
        $cate_id = input('cate_id',0);
        $coach_id = input('coach_id',0);

        //所有课程点进来的 额外传参
        $lesson_id = input('lesson_id',0);

        $where = [
            'slot.starttime' => ['BETWEEN',[$date,$date+86399]],
            'slot.status' => 0,  //状态:0=报名中,20=已点名,30=已取消
            //'slot.is_show' => 1, //是否显示:1=上架,0=下架
            'lesson.is_show' => 1,//课程须上架
        ];


        //课时
        $list = Db::name('lesson_slot')->alias('slot')
            ->field('slot.*,lesson.name,lesson.name_en,lesson.image,lesson.price')
            ->join('lesson','slot.lesson_id = lesson.id','LEFT')
            ->where($where);
        if($lesson_id){
            $list->where('slot.lesson_id',$lesson_id);
        }else{
            if($cate_id){
                $list->where('lesson.lessoncate_id',$cate_id);
            }
            if($coach_id){
                $list->where('find_in_set(:coach_ids,coach_ids)', ['coach_ids' => $coach_id]);
            }
        }

        $list = $list->order('slot.starttime asc,slot.id asc')->select();
        if(empty($list)){
            $this->success(1,[]);
        }
        $list = list_domain_image($list,['image']);
        $list = $this->list_lang($list,['name']);

        //准备教练数据
        $coach_list = Db::name('coach')->column('id,nickname');

        foreach($list as $key => &$slot){
            //hours转换
            $slot['hours'] = floatval($slot['hours']);
            //放入教练
            $coach_text = '';
            $coach_ids = explode(',',$slot['coach_ids']);
            foreach($coach_ids as $coach_id){
                if(isset($coach_list[$coach_id])){
                    $coach_text .= $coach_list[$coach_id].',';
                }
            }
            $slot['coach_text'] = substr($coach_text,0,-1);

            //剩余空位数量
            $pay_number = Db::name('lesson_order')->where('slot_id',$slot['id'])->where('jointype',1)->where('order_status',10)->sum('usernumber');
            $slot['num_remain'] = $slot['num_max'] - $pay_number;
            if($slot['num_remain'] < 0){
                $slot['num_remain'] = 0;
            }

            //剩余候补数量
            $slot['wait_remain'] = 0;
            if($slot['waitnum_max'] > 0){
                $wait_number = Db::name('lesson_order')->where('slot_id',$slot['id'])->where('jointype',2)->where('order_status',0)->sum('usernumber');
                $slot['wait_remain'] = $slot['waitnum_max'] - $wait_number;
                if($slot['wait_remain'] < 0){
                    $slot['wait_remain'] = 0;
                }
            }

            //预约按钮,1能预约,0不能
            $slot['button_status'] = 0;

            if($slot['status'] == 0 && $slot['num_remain'] > 0){
                $slot['button_status'] = 1;//能预约
            }
            if($slot['status'] == 0 && $slot['wait_remain'] > 0){
                $slot['button_status'] = 2;//能候补
            }

            //右上角备注
            if(time() >= $slot['starttime']){
                $slot['num_remark'] = __('报名已截止');
                $slot['button_status'] = 0;//报名截止了,强制改
            }else{
//                $slot['num_remark'] = __('剩N个名额',['number'=>$slot['num_remain']]);
                $slot['num_remark'] = __('预约:').$pay_number.'/'.$slot['num_max'];
                if($slot['waitnum_max'] > 0){
                    $slot['num_remark'] .= '  '. __('候补:') .$wait_number.'/'.$slot['waitnum_max'];
                }
            }
            //上下架的影响
            if($slot['is_show'] == 0){
                $slot['num_remark'] = __('限制预约');
                $slot['button_status'] = 0;//不能预约,强制改
            }
        }

        $this->success(1,$list);
    }

    public function test(){
        echo __('剩N个名额',['number'=>8]);
    }

    //课时详情
    public function slot_info(){
        $slot_id = input('slot_id',0);
        $number  = input('number',1,'intval');

        //课时
        $info = Db::name('lesson_slot')->alias('slot')
            ->field('slot.*,lesson.name,lesson.name_en,lesson.image,lesson.price,danceroom.name as danceroom_name,danceroom.name_en as danceroom_name_en')
            ->join('lesson','slot.lesson_id = lesson.id','LEFT')
            ->join('danceroom','slot.danceroom_id = danceroom.id','LEFT')
            ->where('slot.id',$slot_id)->where('slot.is_show',1)->find();
        if(empty($info)){
            $this->error('课程可能已取消,请刷新重试');
        }

        $info = info_domain_image($info,['image']);
        $info = $this->info_lang($info,['name','danceroom_name','address','remark']);

        //准备教练数据
        $coach_list = Db::name('coach')->where('id','IN',$info['coach_ids'])->column('nickname');
        $info['coach_text'] = implode(',',$coach_list);

        //剩余空位数量
        $pay_number = Db::name('lesson_order')->where('slot_id',$info['id'])->where('jointype',1)->where('order_status',10)->sum('usernumber');
        $info['num_remain'] = $info['num_max'] - $pay_number;
        if($info['num_remain'] < 0){
            $info['num_remain'] = 0;
        }

        //剩余候补数量
        $info['wait_remain'] = 0;
        $info['wait_number'] = 0;
        if($info['waitnum_max'] > 0){
            $wait_number = Db::name('lesson_order')->where('slot_id',$info['id'])->where('jointype',2)->where('order_status',0)->sum('usernumber');
            $info['wait_number'] = $wait_number;
            $info['wait_remain'] = $info['waitnum_max'] - $wait_number;
            if($info['wait_remain'] < 0){
                $info['wait_remain'] = 0;
            }
        }

        //时间
        if($this->lang == 'en'){
            $info['slot_time'] = date('M d',$info['starttime']).'('.date('D',$info['starttime']).')'.','.date('H:i',$info['starttime']).'-'.date('H:i',$info['endtime']);
        }else{
            $info['slot_time'] = date('n月d',$info['starttime']).'(周'.date('N',$info['starttime']).')'.','.date('H:i',$info['starttime']).'-'.date('H:i',$info['endtime']);
        }


        //是否有可买配套
        $wait_buy_package = Db::name('lesson_package')
            ->where('find_in_set(:lesson_ids,lesson_ids)', ['lesson_ids' => $info['lesson_id']])
            ->where('is_show',1)
            ->find();
        $info['wait_buy_package'] = !empty($wait_buy_package) ? 1 : 0;


        //预约按钮,1能预约,0不能
        $info['button_status'] = 0;

        if($info['status'] == 0 && $info['num_remain'] > 0){
            $info['button_status'] = 1;//能预约
        }
        if($info['status'] == 0 && $info['wait_remain'] > 0){
            $info['button_status'] = 2;//能候补
        }

        //右上角备注
        if(time() >= $info['starttime']){
            $info['button_status'] = 0;//报名截止了,强制改
        }

        //总价格乘出来
        $info['price'] = bcmul($info['price'],$number,2);

        //此课程是否还有未使用的套餐(多个包含赠送的)
        $number_hours = bcmul($number,$info['hours'],1);//每日课时按小时扣
        $map = [
            'o.user_id' =>$this->auth->id,

            'o.endtime' => ['gt',time()],
            'o.remain' => ['egt',$number_hours], //不能只是大于0,还得大于等于报名人数
            'o.order_status' => 1,
            'o.use_status'   => 1, //已激活的。
        ];
        $package_list = Db::name('package_order')->alias('o')
            ->join('lesson_package p','o.package_id = p.id','LEFT')
            ->field('o.id,o.remain,o.starttime,o.endtime,o.is_gift,p.name,p.name_en')
            ->where($map)
            ->where('find_in_set(:lesson_ids,o.lesson_ids)', ['lesson_ids' => $info['lesson_id']])
            ->order('o.endtime asc')->select();
        $package_list = $this->list_lang($package_list,['name']);
        if(!empty($package_list)){
            foreach($package_list as $key => &$val){
                //转换remain
                $val['remain'] = floatval($val['remain']);

                if($this->lang == 'zh-cn'){
                    $val['time_text'] = date('m月d,Y',$val['starttime']).'-'.date('m月d,Y',$val['endtime']);
                }else{
                    $val['time_text'] = date('M d,Y',$val['starttime']).'-'.date('M d,Y',$val['endtime']);
                }
            }
        }

        $info['package_list'] = $package_list;

        //可用试课
        if($number == 1){
            $try_map = [
                'o.user_id' => $this->auth->id,
                'o.endtime' => ['gt',time()],
                'o.order_status' => 10,
            ];
            $tryorder_list = Db::name('trylesson_order')->alias('o')
                ->join('trylesson','o.trylesson_id = trylesson.id','LEFT')
                ->field('o.id,o.starttime,o.endtime,trylesson.name,trylesson.name_en')
                ->where($try_map)
                ->where('find_in_set(:lesson_ids,o.lesson_ids)', ['lesson_ids' => $info['lesson_id']])
                ->order('o.endtime asc')->select();
            $tryorder_list = $this->list_lang($tryorder_list,['name']);
            if(!empty($tryorder_list)){
                foreach($tryorder_list as $key => &$val){

                    if($this->lang == 'zh-cn'){
                        $val['time_text'] = date('m月d,Y',$val['starttime']).'-'.date('m月d,Y',$val['endtime']);
                    }else{
                        $val['time_text'] = date('M d,Y',$val['starttime']).'-'.date('M d,Y',$val['endtime']);
                    }
                }
            }
        }else{
            $tryorder_list = [];
        }

        $info['tryorder_list'] = $tryorder_list;


        //hours转换
        $info['hours'] = floatval($info['hours']);


        $this->success(1,$info);
    }

    //课时申请报名,提前预判
    public function slot_apply_before(){
        if(!$this->apiLimit()){
            $this->error(__('点击太频繁,休息一下吧'));
        }

        $slot_id = input('slot_id',0,'intval');
        $number  = input('number',1,'intval');

        if($number <= 0){
            $this->error('预约人数错误');
        }

        //课时
        $info = Db::name('lesson_slot')->alias('slot')
            ->field('slot.*,lesson.name,lesson.name_en,lesson.image,lesson.price')
            ->join('lesson','slot.lesson_id = lesson.id','LEFT')
            ->where('slot.id',$slot_id)->where('slot.status',0)->where('slot.is_show',1)->find();
        if(empty($info)){
            $this->error('课程可能已取消,请刷新重试');
        }
        if($info['endtime'] < time()){
            $this->error('课程已经结束了,不能再进行预约');
        }


        //剩余空位数量
        $pay_number = Db::name('lesson_order')->where('slot_id',$slot_id)->where('jointype',1)->where('order_status',10)->sum('usernumber');
        $num_remain = $info['num_max'] - $pay_number;
        if($num_remain < 0){
            $num_remain = 0;
        }

        //预约数量足够
        if($num_remain >= $number){
            $this->success('success',1);
        }

        //剩余候补数量
        $wait_remain = 0;
        if($info['waitnum_max'] > 0){
            $wait_number = Db::name('lesson_order')->where('slot_id',$info['id'])->where('jointype',2)->where('order_status',0)->sum('usernumber');
            $wait_remain = $info['waitnum_max'] - $wait_number;
            if($wait_remain < 0){
                $wait_remain = 0;
            }
        }

        //候补数量足够
        if($wait_remain >= $number){
            $this->success(__('可预约人数不足。请确认您是否想在候补名单上。一旦他人取消,您将被自动添加到班级中'),2);
        }

        //两者都不够了
        $this->error('可预约名额不足');

    }
    //课时申请报名
    public function slot_apply(){
        if(!$this->apiLimit()){
            $this->error(__('点击太频繁,休息一下吧'));
        }

        $slot_id = input('slot_id',0,'intval');
        $number  = input('number',1,'intval');
        $remark  = input('remark','','trim');
        $paytype = input('paytype',1,'intval');//支付类型:1=课程套餐,2=线上付款,3=购买套餐中,4=试课单,5=候补
        $packageorder_id   = input('packageorder_id',0,'intval');
        $trylessonorder_id = input('trylessonorder_id',0,'intval');
        $jointype = input('jointype',1);//预约类型:1=预约,2=候补

        if($number <= 0){
            $this->error('预约人数错误');
        }
        if(!in_array($paytype,[1,2,3,4])){
            $this->error();
        }
        if(!in_array($jointype,[1,2])){
            $this->error();
        }

        //课时
        $info = Db::name('lesson_slot')->alias('slot')
            ->field('slot.*,lesson.name,lesson.name_en,lesson.image,lesson.price')
            ->join('lesson','slot.lesson_id = lesson.id','LEFT')
            ->where('slot.id',$slot_id)->where('slot.status',0)->where('slot.is_show',1)->find();
        if(empty($info)){
            $this->error('课程可能已取消,请刷新重试');
        }
        if($info['endtime'] < time()){
            $this->error('课程已经结束了,不能再进行预约');
        }


        //剩余空位数量
        $pay_number = Db::name('lesson_order')->where('slot_id',$slot_id)->where('jointype',1)->where('order_status',10)->sum('usernumber');
        $num_remain = $info['num_max'] - $pay_number;
        if($num_remain < 0){
            $num_remain = 0;
        }

        //剩余候补数量
        $wait_remain = 0;
        if($info['waitnum_max'] > 0){
            $wait_number = Db::name('lesson_order')->where('slot_id',$info['id'])->where('jointype',2)->where('order_status',0)->sum('usernumber');
            $wait_remain = $info['waitnum_max'] - $wait_number;
            if($wait_remain < 0){
                $wait_remain = 0;
            }
        }

        //报名人数不能超限
        if($jointype == 1){
            if($num_remain < $number){
                $this->error(__('预约名额只剩N名',['number'=>$num_remain]));
            }
            //可以继续
        }else{
            /*if($num_remain > 0){
                $this->error(__('预约还有名额,不能候补'));
            }*/
            //候补人数不能超限
            if($wait_remain < $number){
                $this->error(__('候补名额只剩N名',['number'=>$wait_remain]));
            }
            //可以继续
            if($paytype != 1){
                $this->error('请选择配套');
            }
            $paytype = 5;//强改支付方式,候补,不能去除
        }

        //
        $number_hours = bcmul($number,$info['hours'],1);//每日课时按小时扣
        $lesson_order = [
            'order_no' => createUniqueNo('S',$this->auth->id),
            'user_id' => $this->auth->id,
            'slot_id' => $slot_id,
            'lesson_id' => $info['lesson_id'],
            'order_amount' => bcmul($info['price'],$number,2),
            'order_status' => 0,
            'paytype' => $paytype, //支付类型:1=课程套餐,2=线上付款,3=购买套餐中,4=试课单,5=候补
            'paytime' => 0,
            'createtime' => time(),
//            'updatetime' => ,
//            'finishtime' => ,
            'usernumber' => $number,
            'usernumber_hours' => $number_hours,
            'userremark' => $remark,
            'package_order_id' => 0,
            'package_remark' => '',//  比如:5/30,5-7/30

            'jointype' => $jointype,
        ];

        //
        Db::startTrans();
        if($paytype == 1){
            //检查已选择套餐
            $map = [
                'user_id' =>$this->auth->id,

                'endtime' => ['gt',time()],
                'remain' => ['gt',0],
                'order_status' => 1,
//                'use_status'   => 1, //已激活的
                'id' => $packageorder_id,
            ];
            $package_order = Db::name('package_order')->where($map)->where('find_in_set(:lesson_ids,lesson_ids)', ['lesson_ids' => $info['lesson_id']])->lock(true)->find();
            if(!$package_order){
                Db::rollback();
                $this->error('配套信息不正确,请刷新重试');
            }

            //课时不足支撑报名人数
            if($package_order['remain'] < $number_hours){
                Db::rollback();
                $this->error('该配套余额不足');
            }
            if($package_order['use_status'] != 1){
                Db::rollback();
                $this->error('该配套尚未激活');
            }

            //扣除一节
            $update = [
                'remain'     => bcsub($package_order['remain'],$number_hours,1),
                'updatetime' => time(),
            ];
            $rs1 = Db::name('package_order')->where('id',$packageorder_id)->update($update);
            if($rs1 === false){
                Db::rollback();
                $this->error('扣除套餐余额失败');
            }

            //修改预约单数据
            $lesson_order['order_amount'] = 0;
            $lesson_order['order_status'] = 10;
            $lesson_order['paytime'] = time();
            $lesson_order['package_order_id'] = $packageorder_id;

            $lesson_order['package_remark'] = ($package_order['sessions'] - $package_order['remain']) . '-' . ($package_order['sessions'] - $package_order['remain'] + $number_hours) .'/'. $package_order['sessions'];


            //预约单写入
            $lesson_order_id = Db::name('lesson_order')->insertGetId($lesson_order);
            if(!$lesson_order_id){
                Db::rollback();
                $this->error('预约失败');
            }

            //更新已预约人数
            $pay_number = Db::name('lesson_order')->where('slot_id',$slot_id)->where('order_status',10)->sum('usernumber');
            $rs_slot = Db::name('lesson_slot')->where('id',$slot_id)->update(['bookednum' => $pay_number]);
            if($rs_slot === false){
                Db::rollback();
                $this->error('预约失败');
            }

            Db::commit();
            $this->success('预约成功',['returntype'=>1]);
        }
        elseif($paytype == 2)
        {
            //预约单写入
            $lesson_order_id = Db::name('lesson_order')->insertGetId($lesson_order);
            if(!$lesson_order_id){
                Db::rollback();
                $this->error('预约失败');
            }

            //支付订单下单
            $pay_order = [];
            $pay_order['user_id'] = $lesson_order['user_id'];
            $pay_order['out_trade_no'] = $lesson_order['order_no'];
            $pay_order['order_amount'] = $lesson_order['order_amount'];
            $pay_order['createtime'] = $lesson_order['createtime'];

            $pay_order['pay_type'] = 'hitpay';
            $pay_order['platform'] = 'app';
            $pay_order['order_status'] = 0;
            $pay_order['table_name'] = 'lesson_order';
            $pay_order['table_id'] = $lesson_order_id;
            $pay_order['args'] = '';

            //拉起支付
            $notify_url = config('notify_cdnurl');
            $redirect_cdnurl = config('hitpay.lesson_redirect_cdnurl').'?out_trade_no='.$pay_order['out_trade_no'].'&lang='.$this->lang;
            $hitpay_return = $this->hitpay_payment($pay_order['out_trade_no'],$pay_order['order_amount'],$notify_url,$redirect_cdnurl);
            if($hitpay_return['status'] !== true){
                $this->error($hitpay_return['msg']);
            }
            //支付请求id
            $pay_order['payment_request_id'] = $hitpay_return['id'];

            $pay_order_id = Db::name('pay_order')->insertGetId($pay_order);
            if(!$pay_order_id){
                Db::rollback();
                $this->error('下单失败');
            }

            Db::commit();

            $return = [
                'url' => $hitpay_return['url'],
                'id'  => $hitpay_return['id'],
                'returntype' => 2,
            ];
            $this->success(1,$return);
        }
        elseif($paytype == 3)
        {
            //预约单写入
            $lesson_order['order_amount'] = 0;
            $lesson_order_id = Db::name('lesson_order')->insertGetId($lesson_order);
            if(!$lesson_order_id){
                Db::rollback();
                $this->error('预约失败');
            }

            Db::commit();

            //去购买套餐,参数代入过去
            $return = [
                'lesson_order_id' => $lesson_order_id,
                'returntype' => 3,
            ];
            $this->success(1,$return);
        }
        elseif($paytype == 4)
        {
            //使用试课单
            $map = [
                'id' => $trylessonorder_id,
                'user_id' =>$this->auth->id,
                'endtime' => ['gt',time()],
                'order_status' => 10,
            ];
            $trylesson_order = Db::name('trylesson_order')->where($map)->where('find_in_set(:lesson_ids,lesson_ids)', ['lesson_ids' => $info['lesson_id']])->lock(true)->find();
            if(!$trylesson_order){
                Db::rollback();
                $this->error('未找到对应的试课');
            }

            //修改预约单数据
            $lesson_order['order_amount'] = 0;
            $lesson_order['order_status'] = 10;
            $lesson_order['paytime'] = time();
            $lesson_order['trylesson_order_id'] = $trylessonorder_id;

            //预约单写入
            $lesson_order_id = Db::name('lesson_order')->insertGetId($lesson_order);
            if(!$lesson_order_id){
                Db::rollback();
                $this->error('预约失败');
            }

            //改掉试课单状态
            $update = [
                'order_status'    => 20,
                'updatetime'      => time(),
                'lesson_order_id' => $lesson_order_id,
            ];
            $rs1 = Db::name('trylesson_order')->where('id',$trylessonorder_id)->update($update);
            if($rs1 === false){
                Db::rollback();
                $this->error('使用试课失败');
            }

            //更新已预约人数
            $pay_number = Db::name('lesson_order')->where('slot_id',$slot_id)->where('order_status',10)->sum('usernumber');
            $rs_slot = Db::name('lesson_slot')->where('id',$slot_id)->update(['bookednum' => $pay_number]);
            if($rs_slot === false){
                Db::rollback();
                $this->error('预约失败');
            }

            Db::commit();
            $this->success('预约成功',['returntype'=>4]);
        }
        elseif($paytype == 5)
        {
            //检查可用的套餐,找一个就可以
            $map = [
                'user_id' =>$this->auth->id,

                'endtime' => ['gt',time()],
                'remain' => ['gt',0],
                'order_status' => 1,
//                'use_status'   => 1, //已激活的
                'id' => $packageorder_id,
            ];
            $package_order = Db::name('package_order')->where($map)->where('find_in_set(:lesson_ids,lesson_ids)', ['lesson_ids' => $info['lesson_id']])->find();
            if(!$package_order){
                Db::rollback();
                $this->error('配套信息不正确,请刷新重试');
            }

            //课时不足支撑报名人数
            if($package_order['remain'] < $number_hours){
                Db::rollback();
                $this->error('该配套余额不足');
            }
            if($package_order['use_status'] != 1){
                Db::rollback();
                $this->error('该配套尚未激活');
            }

            //扣除一节。延迟到转正的时候处理
            //修改预约单数据。延迟到转正的时候处理
            $lesson_order['package_order_id'] = $packageorder_id;

            //预约单写入
            $lesson_order_id = Db::name('lesson_order')->insertGetId($lesson_order);
            if(!$lesson_order_id){
                Db::rollback();
                $this->error('预约失败');
            }

            //更新已预约人数。候补就不需要了

            Db::commit();
            $this->success('预约候补成功',['returntype'=>5]);
        }
    }

    //配套商店 所有套餐列表
    public function package_shop(){

        $where2 = [];
        //排除限购一次的
        $map = [
            'o.user_id'      => $this->auth->id,
            'o.order_status' => 1,
            'o.is_gift'      => 0,
            'p.buytimes'     => 1,
        ];
        $check_first = Db::name('package_order')->alias('o')
            ->join('lesson_package p','o.package_id = p.id','LEFT')
            ->where($map)->column('o.package_id');
        if(!empty($check_first)){
            $where2['id'] = ['NOTIN',$check_first];
        }

        //排除新旧会员群体
        if($this->auth->oldstatus == 0){ //新会员
            $where2['newuser'] = 1;
        }
        if($this->auth->oldstatus == 1){ //旧会员
            $where2['olduser'] = 1;
        }

        //套餐列表
        $list = Db::name('lesson_package')
            ->where('is_show',1)
            ->where($where2)
            ->order('weigh desc')->select();
        $list = list_domain_image($list,['image']);
        $list = $this->list_lang($list,['name','validity','activeremark']);

        $this->success(1,$list);
    }
    //从预约过来的 售课套餐列表
    public function package_list(){
        $lesson_id = input('lesson_id',0);

        $where2 = [];
        //排除限购一次的
        $map = [
            'o.user_id'      => $this->auth->id,
            'o.order_status' => 1,
            'o.is_gift'      => 0,
            'p.buytimes'     => 1,
        ];
        $check_first = Db::name('package_order')->alias('o')
            ->join('lesson_package p','o.package_id = p.id','LEFT')
            ->where($map)->column('o.package_id');
        if(!empty($check_first)){
            $where2['id'] = ['NOTIN',$check_first];
        }

        //排除新旧会员群体
        if($this->auth->oldstatus == 0){ //新会员
            $where2['newuser'] = 1;
        }
        if($this->auth->oldstatus == 1){ //旧会员
            $where2['olduser'] = 1;
        }

        //套餐列表
        $list = Db::name('lesson_package')
            ->where('find_in_set(:lesson_ids,lesson_ids)', ['lesson_ids' => $lesson_id])
            ->where('is_show',1)
            ->where($where2)
            ->order('weigh desc')->select();
        $list = list_domain_image($list,['image']);
        $list = $this->list_lang($list,['name','validity','activeremark']);

        $this->success(1,$list);
    }

    //售课套餐详情
    public function package_info(){
        $package_id = input('package_id',0);

        //套餐详情
        $list = Db::name('lesson_package')
            ->where('id',$package_id)
            ->order('weigh desc')->find();
        $list = info_domain_image($list,['image']);
        $list = $this->info_lang($list,['name','validity','activeremark','content']);

        $this->success(1,$list);
    }

    //下单购买售课套餐
    public function package_buy(){
        $package_id = input('package_id',0);
        $lesson_order_id = input('lesson_order_id',0,'intval');//预约单id

        $package_info = Db::name('lesson_package')->where('id',$package_id)->find();

        //如果限购,则报错
        if($package_info['buytimes'] == 1){
            $map = [
                'user_id'      => $this->auth->id,
                'order_status' => 1,
                'is_gift'      => 0,
                'package_id'   => $package_id,
            ];
            $check_first = Db::name('package_order')->where($map)->find();
            if(!empty($check_first)){
                $this->error('该配套限购一次,您已经买过了');
            }
        }

        //排除新旧会员群体
        if($this->auth->oldstatus == 0 && $package_info['newuser'] != 1 ){ //新会员
            $this->error('您不能购买改配套,请刷新并重试');
        }
        if($this->auth->oldstatus == 1 && $package_info['olduser'] != 1 ){ //旧会员
            $this->error('您不能购买改配套,请刷新并重试');
        }

        //套餐订单
        $data = [
            'order_no'    => createUniqueNo('P',$this->auth->id),
            'user_id'     => $this->auth->id,
            'type'        => $package_info['type'],
            'package_id'  => $package_id,
            'lesson_ids'  => $package_info['lesson_ids'],
            'sessions'    => $package_info['sessions'],
            'starttime'   => 0,
            'days'        => $package_info['days'],
            'endtime'     => 0,
            'price'       => $package_info['price'],
            'remain'      => $package_info['sessions'],
            'order_status'=> 0,
            'use_status'  => 0,//默认不激活
            'paytime'     => 0,
            'pay_type'     => 1, //线上支付
            'createtime'  => time(),
            'updatetime'  => 0,
            'is_gift'     => 0,
        ];

        //如果有赠品,赠品订单
        $gift = [];
        if(!empty($package_info['gift_lesson_id']) && !empty($package_info['gift_sessions'])){
            $gift = $data;

            //订单号不换了
            $gift['type']       = $package_info['gift_type'];
            $gift['lesson_ids'] = $package_info['gift_lesson_id'];
            $gift['sessions']  = $package_info['gift_sessions'];
            $gift['remain']    = $package_info['gift_sessions'];
            $gift['is_gift']   = 1;
        }

        //支付订单下单
        $pay_order = [];
        $pay_order['user_id'] = $data['user_id'];
        $pay_order['out_trade_no'] = $data['order_no'];
        $pay_order['order_amount'] = $data['price'];
        $pay_order['createtime'] = $data['createtime'];

        $pay_order['pay_type'] = 'hitpay';
        $pay_order['platform'] = 'app';
        $pay_order['order_status'] = 0;
        $pay_order['table_name'] = 'package_order';
        $pay_order['table_id'] = 0;
        $pay_order['args'] = json_encode(['lesson_order_id'=>$lesson_order_id]);//用来支付完成回调时,扣除N节课,并改掉预约单的状态

        //拉起支付
        $notify_url = config('notify_cdnurl');
        $redirect_cdnurl = config('hitpay.package_redirect_cdnurl').'?out_trade_no='.$pay_order['out_trade_no'].'&lang='.$this->lang;
        $hitpay_return = $this->hitpay_payment($pay_order['out_trade_no'],$pay_order['order_amount'],$notify_url,$redirect_cdnurl);
        if($hitpay_return['status'] !== true){
            $this->error($hitpay_return['msg']);
        }
        //支付请求id
        $pay_order['payment_request_id'] = $hitpay_return['id'];


        //入库
        Db::startTrans();
        $order_id = Db::name('package_order')->insertGetId($data);
        if(!$order_id){
            Db::rollback();
            $this->error('下单失败');
        }

        //礼物
        if(!empty($gift)){
            $gift_order_id = Db::name('package_order')->insertGetId($gift);
            if(!$gift_order_id){
                Db::rollback();
                $this->error('下单失败');
            }
        }

        //支付单
        $pay_order['table_id'] = $order_id;
        $pay_order_id = Db::name('pay_order')->insertGetId($pay_order);
        if(!$pay_order_id){
            Db::rollback();
            $this->error('下单失败');
        }

        Db::commit();

        $return = [
            'url' => $hitpay_return['url'],
            'id'  => $hitpay_return['id'],
        ];
        $this->success(1,$return);

    }

    //拉起支付
    private function hitpay_payment($out_trade_no,$money,$notifyurl,$redirect_cdnurl)
    {
        $return = [
            'status' => false,
            'msg'  => '',
            'url' => '',
            'id' => 0,
        ];

        $apiKey = config('hitpay.apikey');

        try {
            $hitPayClient = new \HitPay\Client($apiKey, true);

            $request = new \HitPay\Request\CreatePayment();

            $request->setAmount($money)
                ->setCurrency('SGD')
                ->setRedirectUrl($redirect_cdnurl)
//                ->setPaymentMethods(['paynow_online','card'])
                ->setPaymentMethods(['paynow_online'])
                ->setPurpose('Elin Dance Studio')
                ->setWebhook($notifyurl)
                ->setReferenceNumber($out_trade_no);

            $result = $hitPayClient->createPayment($request);

            $return['status'] = true;
            $return['url'] = $result->getUrl();
            $return['id']  = $result->getId();


            //print_r($result);

            /*$data = $hitPayClient->getPaymentStatus($result->getId());
            dump($data);
            dump($data->status);*/

            /*$data = $hitPayClient->deletePaymentRequest($data->getId());
            print_r($data);*/


        } catch (\Exception $e) {
            $return['msg'] = $e->getMessage();
        }

        return $return;
    }


}