<?php

namespace App\Http\Controllers\Xchengxu\Book;

use Illuminate\Http\Request;
use App\Http\Controllers\Xchengxu\BaseController;
use Redis;
use App\Modules\Book\Services\ChapterService;
use App\Modules\User\Services\ReadRecordService;
use App\Http\Controllers\Xchengxu\Book\Transformers\ChapterTransformer;
use App\Modules\Book\Services\BookConfigService;
use App\Http\Controllers\Xchengxu\Book\Transformers\ChapterListTransformer;
use App\Modules\Subscribe\Services\BookOrderService;
use App\Modules\Subscribe\Services\ChapterOrderService;
use App\Modules\Subscribe\Services\YearOrderService;
use App\Modules\OfficialAccount\Services\ForceSubscribeService;
use App\Modules\Subscribe\Services\ChapterReminderService;
use App\Modules\OfficialAccount\Services\OfficialAccountService;
use Hashids;
use GuzzleHttp\Client;
use Log;
use DB;
use App\Modules\User\Services\UserSignService;
use App\Modules\User\Services\UserDeepReadTagService;
class ChapterController extends BaseController
{

    /**
     * @apiDefine Chapter 章节
     */

    /**
     * @apiVersion 1.0.0
     * @apiDescription 章节列表不分页
     * @api {get} books/{bid}/allcatalog 章节列表不分页
     * @apiParam {String}  [token]  token
     * @apiHeader {String} [Authorization]  token 两个token任选其一
     * @apiGroup Chapter
     * @apiName getCatalog
     * @apiSuccess {int}         code 状态码
     * @apiSuccess {String}      msg  信息
     * @apiSuccess {object}      data 结果集
     * @apiSuccess {Array}       data.list 分页结果集
     * @apiSuccess {Int}         data.list.bid   bid
     * @apiSuccess {Int}         data.list.chapter_id   章节id
     * @apiSuccess {String}      data.list.chapter_name   章节名称
     * @apiSuccess {Int}         data.list.chapter_sequence   序号
     * @apiSuccess {Int}         data.list.chapter_is_vip   是否vip
     * @apiSuccess {Int}         data.list.chapter_size   章节大小
     * @apiSuccess {Int}         data.list.prev_cid   上一章节id
     * @apiSuccess {Int}         data.list.next_cid   下一章节
     * @apiSuccess {String}      data.list.recent_update_at   更新时间
     * @apiSuccess {String}      data.list.is_need_subscirbe   是否强制关注
     * @apiSuccess {object}      data.meta   分页信息
     * @apiSuccess {Int}         data.meta.total  总条数
     * @apiSuccess {Int}         data.meta.per_page  每页条数
     * @apiSuccess {Int}         data.meta.current_page 当前页
     * @apiSuccess {Int}         data.meta.last_page  最后页
     * @apiSuccess {String}      data.meta.next_page_url  下一页
     * @apiSuccess {String}      data.meta.prev_page_url  上一页
     * @apiSuccessExample {json} Success-Response:
     *     HTTP/1.1 200 OK
     *     {
     *       code: 0,
     *       msg: "",
     *       data:
     *            [
     *             {
     *               bid: 5,
     *               chapter_id: 5,
     *               chapter_name: "第1240章 不是我",
     *               chapter_sequence: 1239,
     *               chapter_is_vip: 1,
     *               chapter_size: 2422,
     *               prev_cid: 0,
     *               next_cid: 0,
     *               recent_update_at: 2017-11-20 15:01:56,
     *               is_need_subscirbe: 1,
     *            },
     *             {
     *               bid: 5,
     *               chapter_id: 5,
     *               chapter_name: "第1240章 不是我",
     *               chapter_sequence: 1239,
     *               chapter_is_vip: 1,
     *               chapter_size: 2422,
     *               prev_cid: 0,
     *               next_cid: 0,
     *               recent_update_at: 2017-11-20 15:01:56,
     *               is_need_subscirbe: 1,
     *            },
     *          ]
     *       }
     */
    public function getCatalog(Request $request,$bid){
        $bid = Hashids::decode($bid)[0];
        $lists = ChapterService::getChapterLists($bid);
        return response()->collection(new ChapterListTransformer,$lists);
    }

    /**
     * @apiVersion 1.0.0
     * @apiDescription 章节列表分页
     * @api {get} books/{bid}/catalog 章节列表分页
     * @apiParam {String}  [token]  token
     * @apiHeader {String} [Authorization]  token 两个token任选其一
     * @apiGroup Chapter
     * @apiName getCatalogPerPage
     * @apiParam   {Int}         page_size  分页大小(默认15)
     * @apiParam   {Int}         page  页码(默认1)
     * @apiSuccess {int}         code 状态码
     * @apiSuccess {String}      msg  信息
     * @apiSuccess {object}      data 结果集
     * @apiSuccess {Array}       data.list 分页结果集
     * @apiSuccess {Int}         data.list.bid   bid
     * @apiSuccess {Int}         data.list.chapter_id   章节id
     * @apiSuccess {String}      data.list.chapter_name   章节名称
     * @apiSuccess {Int}         data.list.chapter_sequence   序号
     * @apiSuccess {Int}         data.list.chapter_is_vip   是否vip
     * @apiSuccess {Int}         data.list.chapter_size   章节大小
     * @apiSuccess {Int}         data.list.prev_cid   上一章节id
     * @apiSuccess {Int}         data.list.next_cid   下一章节
     * @apiSuccess {String}      data.list.recent_update_at   更新时间
     * @apiSuccess {String}      data.list.is_need_subscirbe   是否强制关注
     * @apiSuccess {object}      data.meta   分页信息
     * @apiSuccess {Int}         data.meta.total  总条数
     * @apiSuccess {Int}         data.meta.per_page  每页条数
     * @apiSuccess {Int}         data.meta.current_page 当前页
     * @apiSuccess {Int}         data.meta.last_page  最后页
     * @apiSuccess {String}      data.meta.next_page_url  下一页
     * @apiSuccess {String}      data.meta.prev_page_url  上一页
     * @apiSuccessExample {json} Success-Response:
     *     HTTP/1.1 200 OK
     *     {
     *       code: 0,
     *       msg: "",
     *       data:
     *            list:[
     *             {
     *               bid: 5,
     *               chapter_id: 5,
     *               chapter_name: "第1240章 不是我",
     *               chapter_sequence: 1239,
     *               chapter_is_vip: 1,
     *               chapter_size: 2422,
     *               prev_cid: 0,
     *               next_cid: 0,
     *               recent_update_at: 2017-11-20 15:01:56,
     *               is_need_subscirbe: 1,
     *            },
     *             {
     *               bid: 5,
     *               chapter_id: 5,
     *               chapter_name: "第1240章 不是我",
     *               chapter_sequence: 1239,
     *               chapter_is_vip: 1,
     *               chapter_size: 2422,
     *               prev_cid: 0,
     *               next_cid: 0,
     *               recent_update_at: 2017-11-20 15:01:56,
     *               is_need_subscirbe: 1,
     *            },
     *          ]
     *          meta:{
     *              total: 1253,
     *              per_page: 15,
     *              current_page: 1,
     *              last_page: 84,
     *              next_page_url: "http://myapi.cn/api/books/1/chapter?page=2",
     *              prev_page_url: ""
     *         }
     *       }
     */
    public function getCatalogPerPage(Request $request,$bid){
        $bid = Hashids::decode($bid)[0];
        $page_size = $request->input('page_size',15);
        $res = ChapterService::getChapterListsPage($bid,$page_size);
        return response()->pagination(new ChapterListTransformer,$res);
    }



    /**
     * @apiVersion 1.0.0
     * @apiDescription 章节内容
     * @api {get} books/{bid}/chapters/{chapter_id} 章节内容
     * @apiParam {String}  [token]  token
     * @apiHeader {String} [Authorization]  token 两个token任选其一
     * @apiGroup Chapter
     * @apiName index
     * @apiSuccess {int}         code 状态码
     * @apiSuccess {String}      msg  信息
     * @apiSuccess {object}      data 结果集
     * @apiSuccess {Int}         data.chapter_id   章节id
     * @apiSuccess {String}      data.chapter_name   章节名称
     * @apiSuccess {Int}         data.chapter_sequence   序号
     * @apiSuccess {Int}         data.chapter_is_vip   是否vip
     * @apiSuccess {Int}         data.chapter_size   章节大小
     * @apiSuccess {Int}         data.prev_cid   上一章节id
     * @apiSuccess {Int}         data.next_cid   下一章节
     * @apiSuccess {String}      data.recent_update_at   更新时间
     * @apiSuccess {String}      data.chapter_content  章节内容
     * @apiSuccess {Int}         data.is_need_subscirbe  是否强制关注(删除)
     * @apiSuccessExample {json} Success-Response:
     *     HTTP/1.1 200 OK
     *     {
     *       code: 0,
     *       msg: "",
     *       data: {
     *               chapter_id: 5,
     *               chapter_name: "第1240章 不是我",
     *               chapter_sequence: 1239,
     *               chapter_is_vip: 1,
     *               chapter_size: 2422,
     *               prev_cid: 0,
     *               next_cid: 0,
     *               recent_update_at: 2017-11-20 15:01:56,
     *               chapter_content: "叶妩被司行霈的阴阳怪气一吓，思路偏得太远了。 她张口结舌，忘记了自己要说什么。",
     *            }
     *       }
     */
    public function index(Request $request,$bid,$cid){
        if(!$this->checkUid()){
            return response()->error('XCX_NOT_LOGIN');
        }
        $oldbid = $bid;
        $bid = Hashids::decode($bid)[0];
        //获取图书信息
        $book_info  = BookConfigService::getBookById($bid);


        if(empty($book_info)) return response()->error('XCX_SYS_ERROR');

        if($book_info->is_on_shelf == 0 || $book_info->is_on_shelf == 3){
            //return response()->error('XCX_OFF_SHELF');
        }
        //获取章节信息
        $chapter = ChapterService::getChapterNameById($cid,$bid);
        if(!$chapter){
            return response()->error('XCX_SYS_ERROR');
        }

        if($chapter->is_vip == 0){
            ReadRecordService::addReadRecord(['uid'=>$this->uid,'bid'=>$bid,'book_name'=>$book_info->book_name,
                'cid'=>$cid,'chapter_name'=>$chapter->name ]);
            //用户标签
            if($chapter->sequence >= 20){
                $this->addTag($book_info);
            }
            return response()->item(new ChapterTransformer,$this->getChapter($bid,$cid,$chapter));
        }

        //已经付费
        if($this->getOrderRecord($bid,$cid)){
            ReadRecordService::addReadRecord(['uid'=>$this->uid,'bid'=>$bid,'book_name'=>$book_info->book_name,
                'cid'=>$cid,'chapter_name'=>$chapter->name ]);
            //用户标签
            if($chapter->sequence >= 20){
                $this->addTag($book_info);
            }
            return response()->item(new ChapterTransformer,$this->getChapter($bid,$cid,$chapter));
        }

        //未付费 要提醒
        $user_info = $this->_user_info;
        //未付费 余额不足
        $fee = $this->getPrice($book_info,$chapter->size);
        $data = [
            'book_id'=>$oldbid,
            'book_name'=>$book_info->book_name,
            'chapter_name'=>$chapter->name,
            'chapter_id'=>$cid,
            'pay_type'=>$book_info->charge_type,
            'fee'=>$fee,
            'user_balance'=>$user_info->balance,
            'product_id'=>$book_info->product_id,
            'uid'=>$this->uid,
            'distribution_channel_id'=>$this->distribution_channel_id,
            'is_discount'=>0,
            'discount_fee' => '',
            'discount'=>''

        ];

        if($user_info['balance'] < $fee){
            //需要提箱
            if($this->isOrderRemind($bid)){

                if($book_info->charge_type == 'BOOK'){
                    return response()->error('XCX_BOOK_BALANCE_PAY',$data);
                }else
                    if($book_info->charge_type == 'CHAPTER'){
                        return response()->error('XCX_CHAPTER_INSUFFICIENT_BALANCE',$data);
                    }else{
                        return response()->error('XCX_SYS_ERROR');
                    }
            }else{
                //不需要提醒
                if($book_info->charge_type == 'BOOK'){
                    return response()->error('XCX_BOOK_SECOND_BALANCE_PAY',$data);
                }elseif($book_info->charge_type == 'CHAPTER'){
                    return response()->error('XCX_CHAPTER_SECOND_BALANCE_PAY',$data);
                }else{
                    return response()->error('XCX_SYS_ERROR');
                }
            }
        }

        if($this->isOrderRemind($bid)){
            //return response()->error('INSUFFICIENT_BALANCE',$data);
            if($book_info->charge_type  == 'BOOK'){
                return response()->error('XCX_BOOK_BUY',$data);
            }else
                if($book_info->charge_type == 'CHAPTER'){
                    return response()->error('XCX_CHAPTER_BUY',$data);
                }else{
                    return response()->error('XCX_SYS_ERROR');
                }
        }
        //付费 不提醒
        if($this->balancePay($book_info,$cid,$chapter->size,$chapter->name,0)){

            ReadRecordService::addReadRecord(['uid'=>$this->uid,'bid'=>$bid,'book_name'=>$book_info->book_name,
                'cid'=>$cid,'chapter_name'=>$chapter->name ]);
            //用户标签
            if($chapter->sequence >= 20){
                $this->addTag($book_info);
            }
            return response()->item(new ChapterTransformer,$this->getChapter($bid,$cid,$chapter));
        }else{

            //不需要提醒
            if($book_info->charge_type == 'BOOK'){
                return response()->error('XCX_BOOK_SECOND_BALANCE_PAY',$data);
            }elseif($book_info->charge_type == 'CHAPTER'){
                return response()->error('XCX_CHAPTER_SECOND_BALANCE_PAY',$data);
            }else{
                return response()->error('XCX_SYS_ERROR');
            }
        }
    }



    /**
     * @apiVersion 1.0.0
     * @apiDescription 余额支付
     * @api {get} books/{bid}/balance/chapterOrders/{cid} 余额支付
     * @apiParam {String}  [token]  token
     * @apiHeader {String} [Authorization]  token 两个token任选其一
     * @apiGroup Chapter
     * @apiName pay
     * @apiParam   (Int)         remind 提醒
     * @apiSuccess {int}         code 状态码
     * @apiSuccess {String}      msg  信息
     * @apiSuccess {object}      data 结果集
     * @apiSuccess {Int}         data.chapter_id   章节id
     * @apiSuccess {String}      data.chapter_name   章节名称
     * @apiSuccess {Int}         data.chapter_sequence   序号
     * @apiSuccess {Int}         data.chapter_is_vip   是否vip
     * @apiSuccess {Int}         data.chapter_size   章节大小
     * @apiSuccess {Int}         data.prev_cid   上一章节id
     * @apiSuccess {Int}         data.next_cid   下一章节
     * @apiSuccess {String}      data.recent_update_at   更新时间
     * @apiSuccess {String}      data.chapter_content  章节内容
     * @apiSuccess {Int}         data.is_need_subscirbe  是否强制关注(删除)
     * @apiSuccessExample {json} Success-Response:
     *     HTTP/1.1 200 OK
     *     {
     *       code: 0,
     *       msg: "",
     *       data: {
     *               chapter_id: 5,
     *               chapter_name: "第1240章 不是我",
     *               chapter_sequence: 1239,
     *               chapter_is_vip: 1,
     *               chapter_size: 2422,
     *               prev_cid: 0,
     *               next_cid: 0,
     *               recent_update_at: 2017-11-20 15:01:56,
     *               chapter_content: "叶妩被司行霈的阴阳怪气一吓，思路偏得太远了。 她张口结舌，忘记了自己要说什么。",
     *            }
     *       }
     */
    public function pay(Request $request,$bid,$cid){

        if(!$this->checkUid()){
            return response()->error('XCX_NOT_LOGIN');
        }
        $remind = (int)$request->input('remind');
        $oldbid = $bid;
        $bid = Hashids::decode($bid)[0];
        $book_info = BookConfigService::getBookById($bid);;
        if(empty($book_info)) response()->error('XCX_SYS_ERROR');

        if($book_info->is_on_shelf == 0 || $book_info->is_on_shelf == 3){
            if(!$this->isBookOrdered($bid)){
                response()->error('XCX_OFF_SHELF');
            } 
        }
        //获取章节
        $chapter = ChapterService::getChapterNameById($cid,$bid);
        if(!$chapter){
            return response()->error('XCX_SYS_ERROR');
        }


        if($this->balancePay($book_info,$cid,$chapter->size,$chapter->name,$remind)){
            ReadRecordService::addReadRecord(['uid'=>$this->uid,'bid'=>$bid,'book_name'=>$book_info->book_name,
                'cid'=>$cid,'chapter_name'=>$chapter->name ]);
            //用户标签
            if($chapter->sequence >= 20){
                $this->addTag($book_info);
            }
            return response()->item(new ChapterTransformer,$this->getChapter($bid,$cid,$chapter));
        }else{
            $fee = $this->getPrice($book_info,$chapter->size);

            $data = [
                'book_id'=>$oldbid,
                'book_name'=>$book_info->book_name,
                'chapter_name'=>$chapter->name,
                'chapter_id'=>$cid,
                'pay_type'=>$book_info->charge_type,
                'fee'=>$fee,
                'user_balance'=>$this->_user_info['balance'],
                'product_id'=>$book_info->product_id,
                'uid'=>$this->uid,
                'distribution_channel_id'=>$this->distribution_channel_id,
                'is_discount'=>0,
                'discount_fee' => '',
                'discount'=>''
            ];
            //不需要提醒
            if($book_info->charge_type == 'BOOK'){
                return response()->error('XCX_BOOK_SECOND_BALANCE_PAY',$data);
            }elseif($book_info->charge_type == 'CHAPTER'){
                return response()->error('XCX_CHAPTER_SECOND_BALANCE_PAY',$data);
            }else{
                return response()->error('XCX_SYS_ERROR');
            }
        }
    }



    /**
     * 余额支付
     * @param $book_info
     * @param $chapter_id
     * @param $chapter_size
     * @return bool
     */
    protected function balancePay($book_info,$chapter_id,$chapter_size,$chapter_name,$is_remind){
        $fee = $this->getPrice($book_info,$chapter_size);
        if((int)$this->_user_info['balance'] >= $fee){
            if($this->bookOrderOrChapterOrder($book_info,$chapter_id,$fee,$chapter_name,$is_remind)){
                return true;
            }
            return false;
        }else{
            return false;
        }

    }


    /**
     * 获取章节内容
     * @param $bid
     * @param $cid
     * @return bool|mixed
     */
    protected function getChapter($bid,$cid,$chapter){
        $chapter_content = ChapterService::getChapter($bid,$cid);
        if(!$chapter_content) return false;
        //$chapter->content = $chapter_content->content;
        $chapter->content = trim(str_replace($chapter_content->name, '', $chapter_content->content));
        //统计点击率
        $key = 'book_click_num_bid_'.$bid;
        $field = date('Y-m-d');
        $old = Redis::hget($key,$field);
        if(!$old)  $old = 0;
        Redis::hset($key,$field,$old+1);
        //签到奖励
        /*
        $sign_key = 'sign-'.date('Y-m-d');
        $sign_status = 0;
        if(!Redis::hexists($sign_key,$this->uid)){
            Redis::hset($sign_key,$this->uid,time());
            $sign_status = 1;
        }*/
        $sign_status = $this->userSign($this->uid);
        $chapter->sign_status = $sign_status;
        return $chapter;
    }

    /**
     * 签到
     * @param $uid
     * @return int
     */
    protected function userSign($uid){

        if($this->distribution_channel_id != 5){
            return 0;
        }

        $day = date('Y-m-d');
        if(UserSignService::isSign($uid,$day)){
            return 0;
        }
        if(UserSignService::sign($uid,$day)){
            return 1;
        }
        return 0;

    }
    /**
     * 添加订购记录
     * @param $book_info
     * @param $chapter_id
     * @param $fee
     * @return bool
     */
    protected function bookOrderOrChapterOrder($book_info,$chapter_id,$fee,$chapter_name,$is_remind){
        $send_order_id = 0;
        if($book_info['charge_type'] == 'BOOK'){
            $data = [
                'uid'=>$this->uid,
                'fee'=>$fee,
                'u'=>$send_order_id,
                'distribution_channel_id'=>$this->distribution_channel_id,
                'bid'=>$book_info->bid,
                'book_name'=>$book_info->book_name,
                'send_order_id'=>$send_order_id,
            ];
            return BookOrderService::addOrderRecodeAndDecrUserBalance($data,$this->uid);
        }
        else{
            $data = [
                'uid'=>$this->uid,
                'fee'=>$fee,
                'cid'=>$chapter_id,
                'bid'=>$book_info->bid,
                'distribution_channel_id'=>$this->distribution_channel_id,
                'book_name'=>$book_info->book_name,
                'chapter_name'=>$chapter_name,
                'send_order_id'=>$send_order_id,
                'is_remind'=>$is_remind
            ];
            //print_r($data);
            if($is_remind){
                $this->addOrderRemind($book_info->bid);
            }
            return ChapterOrderService::addOrderAndDecrUserBalance($data,$this->uid);
        }
    }


    protected  function  addOrderRemind($bid){
        if(ChapterReminderService::checkIsNoReminder($this->uid,$bid)){
            return true;
        }else{
            ChapterReminderService::add($this->uid,$bid);
            return true;
        }
    }
    /**
     * 是否订购提醒
     * @param $chapter_id
     * @return bool
     */
    protected function isOrderRemind($bid){
        $is_no_reminder = ChapterReminderService::checkIsNoReminder($this->uid,$bid) ? 1 : 0;
        return $is_no_reminder == 0;
    }

    /**
     * 用户是否关注
     * @param $uid
     * @return bool
     */
    protected  function getSubscribe(){
        $res = ForceSubscribeService::forceSubscribeUsersByUid(['uid'=>$this->uid]);
        if($res) return true;
        return false;
    }


    /**
     * 获取订购记录
     * @param $book_info
     * @param $chapter_id
     * @return bool
     */
    protected function getOrderRecord($bid,$chapter_id){
        //包年记录
        $uid = $this->uid;
        $res = YearOrderService::getRecord($uid);
        if($res) return true;
        $res = null;

        //单本订购记录
        $res = BookOrderService::getRecordByuidBid($uid,$bid);
        if($res) return true;
        $res = null;

        //章节订购记录
        $chapterOrder = new ChapterOrderService();

        if($chapterOrder->checkIsOrdered($uid,$bid,$chapter_id))  return true;

        return false;
    }


    /**
     * 计算价格
     * @param $book_info
     * @param $chapter_size
     * @return float
     */
    protected function getPrice($book_info,$chapter_size){
        if($book_info->charge_type == 'BOOK')
            return $book_info->price*100;
        return   ceil($chapter_size/100);
    }




    /**
     * 用户添加标签
     * @param $book_info
     */
    protected function addTag($book_info){
        $send_order_id = 0;
        if(!UserDeepReadTagService::isAddTag($this->uid,$book_info->bid)){
            try{
                UserDeepReadTagService::addTag([
                    'uid'=>$this->uid,
                    'bid'=>$book_info->bid,
                    'book_name'=>$book_info->book_name,
                    'category_id'=>$book_info->category_id,
                    'category_name'=>$book_info->category_name,
                    'sex_preference'=>$book_info->channel_name?$book_info->channel_name:'',
                    'distribution_channel_id'=>$this->distribution_channel_id?$this->distribution_channel_id:'0',
                    'send_order_id'=>$send_order_id,
                ]);
            }catch (\Exception  $e){

            }

        }    
    }


    protected function isBookOrdered($bid){

        $chapter_order = ChapterOrderService::checkBookIsOrdered($this->uid,$bid);
        if($chapter_order) return true;

        $res = BookOrderService::getRecordByuidBid($this->uid,$bid);
        if($res) return true;
        return false;
    }
}
