<?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 desc')->autopage()->select();
        $list = list_domain_image($list,['image']);
        $list = $this->list_lang($list,['name','content']);

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

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

    //课时首页
    public function slot_list(){

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

        $where = [
            'slot.starttime' => ['BETWEEN',[$date,$date+86399]],
        ];
        if($lesson_id){
            $where['slot.lesson_id'] = $lesson_id;
        }

        //课时
        $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($coach_id){
            $list->where('find_in_set(:coach_ids,coach_ids)', ['coach_ids' => $coach_id]);
        }
        $list = $list->order('slot.starttime 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){
            //放入教练
            $coach_text = '';
            $coach_ids = explode(',',$slot['coach_ids']);
            foreach($coach_ids as $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('order_status',10)->sum('usernumber');
            $slot['num_remain'] = $slot['num_max'] - $pay_number;

            //右上角备注
            if(time() >= $slot['starttime']){
                $slot['num_remark'] = '报名已截止';
            }else{
                $slot['num_remark'] = '剩'.$slot['num_remain'].'空位';
            }
        }

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

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

        //课时
        $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)->find();
        if(empty($info)){
            $this->error('课程可能已取消,请刷新重试');
        }

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

        //准备教练数据
        $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('order_status',10)->sum('usernumber');
        $info['num_remain'] = $info['num_max'] - $pay_number;

        //此课程是否还有未使用的套餐(多个包含赠送的)
        $map = [
            'o.user_id' =>$this->auth->id,
            'o.lesson_id' => $info['lesson_id'],
            'o.endtime' => ['gt',time()],
            'o.remain' => ['gt',0],
            'o.order_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)->order('o.endtime asc')->select();
        $package_list = $this->list_lang($package_list,['name']);
        $info['package_list'] = $package_list;


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

    //课时申请报名
    public function slot_apply(){
        $slot_id = input('slot_id',0,'intval');
        $number  = input('number',1,'intval');
        $remark  = input('remark','','trim');
        $paytype = input('paytype',1,'intval');//支付类型:1=课程套餐,2=线上付款,3=购买套餐中
        $packageorder_id = input('packageorder_id',0,'intval');
        if($number <= 0){
            $this->error('报名人数错误');
        }
        if(!in_array($paytype,[1,2,3])){
            $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)->find();
        if(empty($info)){
            $this->error('课程可能已取消,请刷新重试');
        }
        if($info['endtime'] < time()){
            $this->error('课程已经结束了,不能再进行预约');
        }

        $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=购买套餐中
            'paytime' => 0,
            'createtime' => time(),
//            'updatetime' => ,
//            'finishtime' => ,
            'usernumber' => $number,
            'userremark' => $remark,
            'package_order_id' => 0,
            'package_remark' => '',//  比如:5/30,5-7/30
        ];

        //
        Db::startTrans();
        if($paytype == 1){
            //检查已选择套餐
            $map = [
                'user_id' =>$this->auth->id,
                'lesson_id' => $info['lesson_id'],
                'endtime' => ['gt',time()],
                'remain' => ['gt',0],
                'order_status' => 1,
                'id' => $packageorder_id,
            ];
            $package_order = Db::name('package_order')->where($map)->lock(true)->find();
            if(!$package_order){
                Db::rollback();
                $this->error('套餐信息不正确,请刷新重试');
            }

            //课时不足支撑报名人数
            if($package_order['remain'] < $number){
                Db::rollback();
                $this->error('该套餐余额不足,可以使用其他支付方式');
            }

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

            //修改预约单数据
            $lesson_order['order_status'] = 10;
            $lesson_order['paytime'] = time();
            $lesson_order['package_order_id'] = $packageorder_id;
            if($number > 1){
                $lesson_order['package_remark'] = ($package_order['sessions'] - $package_order['remain'] + 1) . '-' . ($package_order['sessions'] - $package_order['remain'] + $number) .'/'. $package_order['sessions'];
            }else{
                $lesson_order['package_remark'] = ($package_order['sessions'] - $package_order['remain'] + 1) .'/'. $package_order['sessions'];
            }

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

            Db::commit();
            $this->success('预约成功');
        }
        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'] = '';

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

            Db::commit();

            //拉起支付

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

            Db::commit();

            //去购买套餐,参数代入过去

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

    //售课套餐列表
    public function package_list(){
        $lesson_id = input('lesson_id',0);

        //套餐列表
        $list = Db::name('lesson_package')->alias('p')
            ->field('p.*,e.image')
            ->join('lesson e','p.lesson_id = e.id','LEFT')
            ->where('p.lesson_id',$lesson_id)
            ->where('p.is_show',1)
            ->order('p.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')->alias('p')
            ->field('p.*,e.image')
            ->join('lesson e','p.lesson_id = e.id','LEFT')
            ->where('p.id',$package_id)
            ->order('p.weigh desc')->find();
        $list = info_domain_image($list,['image']);
        $list = $this->info_lang($list,['name','validity','activeremark']);

        $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();

        //套餐
        $data = [
            'order_no'    => createUniqueNo('P',$this->auth->id),
            'user_id'     => $this->auth->id,
            'package_id'  => $package_id,
            'lesson_id'   => $package_info['lesson_id'],
            'sessions'    => $package_info['sessions'],
            'starttime'   => time(),
            'days'        => $package_info['days'],
            'endtime'     => time() + ($package_info['days'] * 86400),
            'price'       => $package_info['price'],
            'remain'      => $package_info['sessions'],
            'order_status'=> 0,
            'paytime'     => 0,
            'createtime'  => time(),
            'updatetime'  => 0,
            'is_gift'     => 0,
        ];

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

            //订单号不换了
            $gift['lesson_id'] = $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节课,并改掉预约单的状态

        //入库
        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();

        //拉起支付

        $this->success(1);

    }


}