<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use GuzzleHttp\Client;
use App\Modules\Book\Models\Book;
use App\Modules\Book\Models\Chapter;
use App\Modules\Book\Services\ChapterService;
use App\Modules\Book\Services\BookConfigService;
use DB;
use Log;

class BookUpdateOne extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'book:updateone
                            {--bid= : the id of a book}
                            {--content}
                            {--start=}
                            {--end=}
                            {--withname}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '更新图书章节内容';

    private $client;

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
        $this->client = new Client(['timeout'  => 8.0,'allow_redirects'=>true]);
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $bid = $this->option('bid');
        if(empty($bid)) return 0;
        $content = $this->option('content');
        if($content){
            $start = $this->option('start');
            $end = $this->option('end');
            $withname = $this->option('withname');
            return $this->updateExistContent($bid,$start,$end,$withname);
        }

        return $this->updateOne($bid);
    }


    /**
     * 更新章节内容 一本书的
     * @param $bid
     * @return int|string
     */
    public function updateOne($bid){
        set_time_limit(0);
        $book_info = Book::find($bid);
        if(empty($book_info) || empty($book_info->ly_bid)) return -1;
        $this->bookStatus($bid,$book_info->ly_bid);
        //$max_sequence = Chapter::where('bid',$bid)->max('sequence');
        //$max_sequence = $max_sequence?$max_sequence:-1;
        //$max_sequence_chapter = Chapter::where('bid',$bid)->where('sequence',$max_sequence)->select('id')->first();
        //$max_sequence_chapter_id = isset($max_sequence_chapter->id)?$max_sequence_chapter->id:0;

        $last_chapter = Chapter::where('bid',$bid)
            ->select('id','name','sequence','prev_cid','next_cid')
            ->orderBy('sequence','desc')
            ->first();
        $last_chapter_from_third = Chapter::where('bid',$bid)
            ->where('ly_chapter_id','>',0)
            ->select('id','name','sequence','prev_cid','next_cid','ly_chapter_id')
            ->orderBy('sequence','desc')
            ->first();
        $max_sequence_chapter_id = isset($last_chapter->id)?$last_chapter->id:0;
        $max_sequence = isset($last_chapter->sequence)?$last_chapter->sequence:0;

        $chapter_list_fromat = "http://www.leyuee.com/services/zwfx.aspx?method=chapterlist&bid=%s&token=sefaf23h7face";
        $res = $this->client->get(sprintf($chapter_list_fromat,$book_info->ly_bid));
        $res = $res->getBody()->getContents();
        if(!$res) return '';
        $book_config_info = DB::table('book_configs')->where('bid',$bid)->first();
        $res = json_decode($res,true);
        $j = 0;
        $size = 0;
        $local_count = Chapter::where('bid',$bid)->where('ly_chapter_id','>',0)->count();
        $remote_count = 0;

        foreach ($res['data'] as $item1) {
            $remote_count += count($item1['chapters']);
            $item1 = null;
        }
        if($remote_count == $local_count) return '';
        $start = false;
        if(!$last_chapter){
            $start = true;
        }
        $ly_last_chapter_id = 0;
        if($last_chapter_from_third && isset($last_chapter_from_third->ly_chapter_id)){
            $ly_last_chapter_id = $last_chapter_from_third->ly_chapter_id;
        }

        foreach ($res['data'] as $v1) {
            foreach ($v1['chapters'] as $v) {
                /*if ($v['chapter_order_number'] <= $max_sequence-1) {
                    continue;
                }*/
                if(!$start){
                    if($v['chapter_id'] != $ly_last_chapter_id){
                        continue;
                    }else{
                        \Log::info($v1);
                        $start = true;
                        continue;
                    }
                }
                /*if (Chapter::where('bid', $bid)->where('ly_chapter_id', $v['chapter_id'])->count()) {
                    continue;
                }*/

                $chapter_fromat = "http://www.leyuee.com/services/zwfx.aspx?method=chapter&bid=%s&cid=%s&token=sefaf23h7face";
                $cahpter_content_res = $this->client->get(sprintf($chapter_fromat, $book_info->ly_bid, $v['chapter_id']));
                $cahpter_content = $cahpter_content_res->getBody()->getContents();

                $temp = [
                    'bid' => $bid,
                    'name' => $v['chapter_name'],
                    'sequence' => ++$max_sequence,
                    'is_vip' => $v['chapter_need_pay'],
                    'prev_cid' => $max_sequence_chapter_id,
                    'next_cid' => '',
                    'recent_update_at' => date('Y-m-d H:i:s', $v['chapter_last_update_time']),
                    'ly_chapter_id' => $v['chapter_id']
                ];
                if ($cahpter_content) {
                    $cahpter_content = json_decode($cahpter_content, true);
                    $temp['size'] = ceil(strlen($cahpter_content['data']['chapter_content']) / 3);
                    $temp['content'] = $cahpter_content['data']['chapter_content'];
                    $size += $temp['size'];
                }
                $insert_res = Chapter::create($temp);
                Chapter::where('id', $max_sequence_chapter_id)->update(['next_cid' => $insert_res->id]);
                $max_sequence_chapter_id = $insert_res->id;
                $temp = null;
                $j++;
            }
        }
        $chapter_count = Chapter::where('bid',$bid)->count();
        $chapter_size = Chapter::where('bid',$bid)->sum('size');
        if($j>0){
            Book::where('id',$bid)->update(['chapter_count'=>$chapter_count,'last_cid'=>$max_sequence_chapter_id,'size'=>$chapter_size,'last_chapter'=>$v['chapter_name']]);
            $this->recordUpdateInfo($bid,[
                'book_name'=>$book_config_info->book_name,
                'update_chapter_count'=>$j,
                'update_words'=>$size,
                'update_type'=>'add_chapter',
                'channel_name'=>$book_info->category_id >=13 ? '女频':'男频'
            ]);
        }
        return $j;
    }

    private function bookStatus($bid,$ly_bid){
        $status = 0;
        try{
            $book_info_url_format =   "http://www.leyuee.com/services/zwfx.aspx?method=bookinfo&token=sefaf23h7face&bid=%s";
            $res = $this->client->get(sprintf($book_info_url_format,$ly_bid));
            $res = $res->getBody()->getContents();
            if($res){
                $res = json_decode($res,true);
                if(isset($res['data']) && isset($res['data']['book_state'])){
                    $status = $res['data']['book_state'];
                }
            }
        }catch (\Exception $e){

        }
        if($status){
            Book::where('id',$bid)->update(['status'=>$status]);
        }
    }

    private function updateExistContent($bid,$start=0,$end=0,$name=false){
        $book_info = Book::find($bid);
        if(empty($book_info) || empty($book_info->ly_bid)) return -1;


        $chapter_list_fromat = "http://www.leyuee.com/services/zwfx.aspx?method=chapterlist&bid=%s&token=sefaf23h7face";
        $res = $this->client->get(sprintf($chapter_list_fromat,$book_info->ly_bid));
        $res = $res->getBody()->getContents();
        if(!$res) return '';
        $res = json_decode($res,true);
        if(!isset($res['data']))
            return '';
        foreach ($res['data'] as $v1){
            foreach ($v1['chapters'] as $v){
                if($start && ($v['chapter_order_number']+1<$start) ){
                    continue;
                }
                if($end && ($v['chapter_order_number']+1>$end)){
                    break;
                }
                $chapter_fromat = "http://www.leyuee.com/services/zwfx.aspx?method=chapter&bid=%s&cid=%s&token=sefaf23h7face";
                $cahpter_content_res = $this->client->get(sprintf($chapter_fromat, $book_info->ly_bid, $v['chapter_id']));
                $cahpter_content = $cahpter_content_res->getBody()->getContents();
                $cahpter_content = json_decode($cahpter_content, true);
                if($cahpter_content && isset( $cahpter_content['data']['chapter_content']) && !empty( $cahpter_content['data']['chapter_content'])){
                    //$temp['size'] = ceil(strlen($cahpter_content['data']['chapter_content']) / 3);
                    //$temp['content'] = $cahpter_content['data']['chapter_content'];
                    $chapter = Chapter::where('bid', $bid)->where('sequence', $v['chapter_order_number']+1)->first();
                    if($chapter){
                        $chapter->content = $cahpter_content['data']['chapter_content'];
                        if($name){
                            $chapter->name =$v['chapter_name'];
                        }
                        $chapter->size = ceil(strlen($cahpter_content['data']['chapter_content']) / 3);
                        ChapterService::editChapter($chapter);
                    }
                }
            }
        }
    }

    private function recordUpdateInfo($bid, $data)
    {
        // 2 book_updates 的更新记录
        DB::table('book_updates')->insert([
            'bid' => $bid,
            'book_name' => $data['book_name'],
            'channel_name' => $data['channel_name'],
            'update_date' => date('Y-m-d'),
            'update_chapter_count' => $data['update_chapter_count'],
            'update_words' => $data['update_words'],
            'update_type' => $data['update_type'],
            'created_at' => date('Y-m-d H:i:s'),
            'updated_at' => date('Y-m-d H:i:s')
        ]);
    }
}