<?php

namespace App\Console\Commands\NhacVn;

use App\Helpers\Constants;
use App\Models\Crontjob;
use App\Models\Track;
use App\Repositories\TrackRepository;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;

class NhacVnCrawlerTrackCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'nhacvn:get-track';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Lấy bài hát từ Nhạc VN';

    protected $trackRepository;

    /**
     * Create a new command instance.
     *
     * NhacVnCrawlerTrackCommand constructor.
     * @param TrackRepository $trackRepository
     */
    public function __construct(TrackRepository $trackRepository)
    {
        parent::__construct();
        ini_set('max_execution_time', -1);
        $this->trackRepository = $trackRepository;
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        echo "\n Bắt đầu xử lý lấy top 20 bài hát từ nhac.vn.";

        // Lấy mảng ID của Zing những bài hát đã insert
        $inserted = $this->trackRepository->getTrackInserted('title', 'original', []);

        // Lấy ds BXH về
        $domain = config('api.nhac_vn.domain');
        $url = config('api.nhac_vn.ranking20');

        $tracks = $this->trackRepository->processNhacVnGetTrackInfoFromTop20($url);

        if (count($tracks) == 0) return false;

        $key_insert = 0;
        $key_update = 0;
        $bulk_track_insert = [];

        foreach ($tracks as $key => $track) {
            // Xử lý insert/update dựa vào tên bài hát
            if (is_array($inserted) && count($inserted) > 0 && in_array($track['title'], $inserted)) {
                // Cập nhật
                $track_db = Track::where('title', $track['title'])->take(1)->get();
                if (isset($track_db[0])) {
                    $track_db[0]->id_nhacvn = $track['id_nhacvn'];
                    $track_db[0]->link_nhacvn = $track['link'];
                    if (empty($track_db[0]->singer_list)) {
                        $track_db[0]->singer_list = $track['singer'];
                    }
                    $track_db[0]->crawler_at = Carbon::now();
                    $track_db[0]->save();
                }
                $key_update++;
            } else {
                $bulk_track_insert[$key_insert]['title'] = $track['title'];
                $bulk_track_insert[$key_insert]['slug'] = null;
                $bulk_track_insert[$key_insert]['userid'] = 0;
                $bulk_track_insert[$key_insert]['tag'] = 'vmusic';
                $bulk_track_insert[$key_insert]['genre'] = 1;
                $bulk_track_insert[$key_insert]['download_hash'] = md5($track['id_nhacvn']);
                $bulk_track_insert[$key_insert]['time'] = time();
                $bulk_track_insert[$key_insert]['id_nhacvn'] = $track['id_nhacvn'];
                $bulk_track_insert[$key_insert]['src_thumbnail_medium'] = $track['img'];
                $bulk_track_insert[$key_insert]['link_nhacvn'] = $track['link'];
                $bulk_track_insert[$key_insert]['singer_list'] = $track['singer'];
                $bulk_track_insert[$key_insert]['crawler_at'] = Carbon::now();

                $key_insert++;
            }
        }

        echo "\n Số bài hát insert: " . $key_insert;
        echo "\n Số bài hát update: " . $key_update;

        if ($key_insert > 0) {
            DB::table(Constants::TABLE_TRACKS)->insert($bulk_track_insert);
            echo "\n Insert thành công.";
        } else {
            echo "\n Không lấy được bài hát nào.";
        }

        // Ghi log
        Crontjob::create(['message' => 'NhacVnCrawlerTrackCommand is called at ' . Carbon::now()]);
    }
}