<?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 Log;
use App\Modules\Book\Services\BookConfigService;
use App\Modules\Book\Services\ChapterService;

class BookUpdate extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'book:update';

    /**
     * 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' => 10.0, 'allow_redirects' => true]);
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $this->updateAll();
    }

    /**
     * 更新所有书的章节
     */
    public function updateAll()
    {
        set_time_limit(0);
        $exist_book = Book::where('ly_bid', '!=', '0')->where('status', 0)->select('id', 'ly_bid')->get();
        foreach ($exist_book as $v) {
            //Log::info('updateAll bid is: '.$v->id.'$ly_bid is :'.$v->ly_bid.'----------------------------');
            $this->updateOne($v->id, $v->ly_bid);
        }
    }

    /**
     * 更新章节内容 一本书的
     * @param $bid
     * @return int|string
     */
    public function updateOne($bid, $ly_bid)
    {
        set_time_limit(0);
        //$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;
        $this->bookStatus($bid, $ly_bid);

        $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;
        $from_sequence = $max_sequence;

        try {
            $chapter_list_fromat = "http://www.leyuee.com/services/zwfx.aspx?method=chapterlist&bid=%s&token=sefaf23h7face";
            $res = $this->client->get(sprintf($chapter_list_fromat, $ly_bid));
            $res = $res->getBody()->getContents();
        } catch (\Exception $e) {
            Log::info($e);
            return '';
        }
        if (!$res) return '';
        $res = json_decode($res, true);
        if ($res && isset($res['code']) && $res['code'] == 200) {

        } else {
            return '';
        }
        $j = 0;

        if (isset($res['data']) && $res['data'] && is_array($res['data'])) {
        } else {
            return '';
        }

        $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;
        }
        Log::info('$remote_count is: ' . $remote_count . '====$local_count :' . $local_count . '----');
        if ($remote_count == $local_count) return '';
        Log::info('$bid =: ' . $bid . '---is lack---');
        $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 (Chapter::where('bid', $bid)->where('ly_chapter_id', $v['chapter_id'])->count()) {
                    continue;
                }*/
                if (!$start) {
                    if ($v['chapter_id'] != $ly_last_chapter_id) {
                        continue;
                    } else {
                        \Log::info($v1);
                        $start = true;
                        continue;
                    }
                }

                Log::info('bid: ' . $bid . '----ly_chapter_id: ' . $v['chapter_id']);
                $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, $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'];
                }
                $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']]);
            //ChapterService::splitContentAll($bid,$from_sequence);
        }
        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]);
        }
    }
}