<?php

namespace App\Console\Test;

use App\Cache\UserCache;
use App\Facade\Site;
use App\Libs\TikTok\Kernel\Support\Str;
use App\Models\MpGeneratePicTask;
use App\Services\DeepSeek\DeepSeekService;
use getID3;
use GuzzleHttp\Client;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redis;
use Illuminate\Support\Facades\Storage;
use Vinkla\Hashids\Facades\Hashids;

use function PHPSTORM_META\map;

/**
 * 测试
 */
class TestCommand extends Command
{
    /**
     * @var string
     */
    protected $signature = 'test {--token=} {--uid=} {--eid=}';

    /**
     * The console command description.
     *  php artisan Payment:BasePayment --bid='1'
     *
     * @var string
     */
    protected $description = '测试';
    protected $deepseekService;


    public function __construct(DeepSeekService $deepseekService
    )
    {
        parent::__construct();
        $this->deepseekService = $deepseekService;
    }


    /**
     * handle
     */
    public function handle()
    {
        // dd(testStoryboardParsing(''));
        dd(handleEpisodeContent(''));
        
        exit();
        $url = 'https://zw-audiobook.tos-cn-beijing.volces.com/video/ai_generation_1772704798_69a9541e94bef';
        $video_name = 'ai_generation_' . time() . '_' . uniqid();
        $video_ext = getVideoExtFromUrl($url);
        $video_name = $video_name . $video_ext;
        dump($video_name);
        $video_url = uploadStreamByTos('video', $url, $video_name);
        dd($video_url);

        // $url = 'https://zw-audiobook.tos-cn-beijing.volces.com/image/ai_generation_1772525682_69a69872e3a87..png';
        // // $url = 'https://zw-audiobook.tos-cn-beijing.volces.com/image/ai_generation_1772525682_69a69872e3a87.png';
        // $compressed_url = compressRemoteImageUrlToSize($url);
        // // $compressed_url = compressRemoteImageUrlToSizeImagick($url);
        // $filename = storage_path('app/public/video_frames/compressed.png');
        // // $url = uploadStreamByTos('image', $compressed_url, $filename);
        // $url = file_put_contents($filename, $compressed_url);
        // dd($url);

        // // 转存阿里云oss文件到tos
        // $audio_effects = DB::table('mp_timbres')->where('id', 246)->get();
        // $total = count($audio_effects);
        // $success = 0;
        // $continue = 0;
        // $fail = 0;
        // foreach ($audio_effects as $item) {
        //     $id = getProp($item, 'id');
        //     $url = getProp($item, 'audio_url');
        //     if (!$url) {
        //         $continue++;
        //         continue;
        //     }
        //     if (!strstr($url, 'https://cdn-zwai.ycsd.cn')) {
        //         $continue++;
        //         continue;
        //     }
        //     $index = strrpos($url, '/');
        //     $filename = mb_substr($url, $index + 1);
        //     $stream = file_get_contents($url);
        //     $new_url = uploadStreamByTos('demonstrate', $stream, $filename);
        //     dd($new_url);
        //     if ($new_url) {
        //         $boolen = DB::table('mp_timbres')->where('id', $id)->update([
        //             'audio_url' => $new_url,
        //             'updated_at' => date('Y-m-d H:i:s'),
        //         ]);
        //         if ($boolen) $success++;
        //         else $fail++;
        //     }else {
        //         dump('未生成新url');
        //         $fail++;
        //     }
        // }
        // dd("总条数:{$total}, 成功条数:{$success}, 跳过条数:{$continue}, 失败条数:{$fail}");
        exit();
        // $audio_effects = DB::table('mp_bgms')->where('is_enabled', 1)->where('playtime_seconds', 0)->get();
        // foreach ($audio_effects as $audio_effect) {
        //     $id = getProp($audio_effect, 'id');
        //     $url = getProp($audio_effect, 'bgm_url');
        //     $index = strrpos($url, '/');
        //     $name = 'The_Dawn';

        //     // 将远程地址文件保存到本地
        //     $filename = storage_path().'/app/public/audio_effect/' . $name;
        //     if (!file_exists($filename)) {
        //         $file = file_get_contents($url);
        //         file_put_contents($filename, $file);
        //     }
            
        //     $getID3 = new getID3();
        //     $ThisFileInfo = $getID3->analyze($filename);
        //     $seconds = floor($ThisFileInfo['playtime_seconds']) ?? 0;
        //     if ($seconds <= 0) $seconds = 1;
        //     DB::table('mp_bgms')->where('id', $id)->update([
        //         'playtime_seconds'  => $seconds,
        //         'updated_at'        => date('Y-m-d H:i:s'),
        //     ]);
        //     unlink($filename);
        // }
        // exit();

        // $wavPath = public_path('audio');
        // if (!file_exists($wavPath)) {
        //     return [];
        // }
        
        // $files = scandir($wavPath);
        
        // $error_voice = [];
        // foreach ($files as $file) {
        //     if ($file !== '.' && $file !== '..') {
        //         $voice_type = pathinfo($file, PATHINFO_FILENAME);
        //         $boolen = DB::table('mp_timbres')->where('timbre_type', $voice_type)->update([
        //             'audio_url'     => 'https://cdn-zwai.ycsd.cn/mp_audio/voice_demo/' . $file,
        //             'is_enabled'    => 1,
        //             'updated_at'    => date('Y-m-d H:i:s'),
        //         ]);
        //         if (!$boolen) $error_voice[] = $file;
        //     }
        // }
        // \Log::info('错误文件：' . json_encode($error_voice, 256));
        // exit();

        // exit();
        $bid = 321;
        $version_id = 1663;
        $cid = 708197;
        $redis_key = "select-{$bid}-{$version_id}-{$cid}";
        // 查询更新后的信息
        $paragraph_urls = DB::table('mp_chapter_paragraph_audios')->where('bid', $bid)->where('version_id', $version_id)
        ->where('cid', $cid)->where(function($query) {
            return $query->where('generate_status', '!=', '制作中')->orWhere('error_msg', '!=', '');
        })->select('id', 'sequence', 'paragraph_audio_url', 'error_msg')
        ->get()->map(function ($value) {
            return (array)$value;
        })->toArray();
        $rem_ids = [];
        foreach ($paragraph_urls as $item) {
            $rem_ids[] = getProp($item, 'id');
        }

        // 删除已发送的id
        Redis::srem($redis_key, $rem_ids);
        dd(Redis::smembers($redis_key));
        exit();
        // $all_timbre = DB::table('mp_timbres')->get();
        // foreach($all_timbre as $timbre) {
        //     $id = getProp($timbre, 'id');
        //     if ($id > 1) {
        //         $language = getProp($timbre, 'language');
        //         $language = str_replace(['、', ','], '，', $language);
        //         DB::table('mp_timbres')->where('id', $id)->update([
        //             'language' => $language,
        //             'first_category_id' => 0,
        //             'first_category_name' => '',
        //             'second_category_id' => 0,
        //             'second_category_name' => '',
        //             'third_category_id' => 0,
        //             'third_category_name' => '',
        //         ]);
        //     }
        // }
        // dd('end');

        ini_set('max_execution_time', 0);
        \Log::info('~~~~~~~~~~~~~~~~~~~~~~~~开始~~~~~~~~~~~~~~~~~~~~~~~~');
        // $a = DB::table('mp_emotion_list')->pluck('emotion_name')->toArray();
        // dd(implode('、', $a));
        // $emotion_str = '​开心（happy），悲伤（sad），生气（angry），惊讶（surprised），恐惧（fear），厌恶（hate），激动（excited），冷漠（coldness），中性（neutral），沮丧（depressed），撒娇（lovey-dovey），害羞（shy），安慰鼓励（comfort），咆哮/焦急（tension），温柔（tender），讲故事 / 自然讲述（storytelling），情感电台（radio），磁性（magnetic），广告营销（advertising），气泡音（vocal - fry），低语 (ASMR)，新闻播报（news），娱乐八卦（entertainment），方言（dialect）';
        // $emotion_arr = explode('，', $emotion_str);
        // $insert_data = [];
        // foreach ($emotion_arr as $emotion) {
        //     preg_match('/(.*)?（(.*?)）/', $emotion, $match);
        //     if (count($match) == 3) {
        //         $insert_data[] = [
        //             'emotion_code'  => $match[2],
        //             'emotion_name'  => $match[1],
        //             'is_enabled'    => 1,
        //             'created_at'    => date('Y-m-d H:i:s'),
        //             'updated_at'    => date('Y-m-d H:i:s'),
        //         ];
        //     }
        // }
        // DB::table('mp_emotion_list')->insert($insert_data);
        // exit();

        $bid = 10917;
        $version_id = 1649;
        $cid = 2669608;

        // $text = '"旁白：刀尖刺穿手掌的瞬间，疼痛自掌心钻入骨髓。{自然讲述}  \n旁白：心脏像是被万箭穿过一般，我痛得几近晕厥。{自然讲述}  \n旁白：可赵晏池显然不愿让我那么痛快地昏过去。{自然讲述}  \n旁白：他命人用一盆盆冰凉刺骨的冷水强行让我保持清醒。{自然讲述}  \n旁白：血迹混杂着水迹在身下漫开，任谁看了都触目惊心。{自然讲述}  \n旁白：意识涣散间，我仿佛在脑海中看到走马灯。{自然讲述}  \n旁白：结婚七年，圈子里无人不知我是赵晏池宠在心尖上的人。{自然讲述}  \n旁白：他会在拍卖会上一掷千金买下我随口说喜欢的东西。{自然讲述}  \n旁白：他会在我生病的时候亲自衣不解带地照顾我。{自然讲述}  \n旁白：从不落泪的男人，看到我身体难受吃不下饭时却心疼得湿了眼眶。{自然讲述}  \n旁白：他会在求婚那天，包下国内外所有大荧幕，高调地向全世界宣布爱我。{自然讲述}  \n旁白：那一夜，满城的天都被他准备的烟花照亮。{自然讲述}  \n旁白：绚烂的烟火下，他深情款款地看着我的眼睛。{自然讲述}  \n赵晏池(男)：我就是要让所有人都知道，你是我赵晏池的夫人，是我的心头肉。{温柔}  \n赵晏池(男)：有我保护你，谁都别想动你一根手指头。{温柔}  \n旁白：可偏偏如今，伤我最深的，就是给过我这些承诺的人。{自然讲述}  \n旁白：压制着我的保镖终于将我松开。{自然讲述}  \n旁白：我想摸摸肚子里的孩子，却根本抬不起手。{自然讲述}  \n旁白：我的手已经被彻底废掉，绵软得使不上一点力气。{自然讲述}  \n赵晏池(男)：把她给我扔出去，别在这边脏了我们的眼睛。{冷漠}  \n旁白：保镖正要照做，却又被旁边的女人制止。{自然讲述}  \n汪思月(女)：等等。{温柔}  \n旁白：她声音轻柔，却像是恶鬼的轻语：{自然讲述}  \n汪思月(女)：晏池，我看他们也挺辛苦的。{温柔}  \n汪思月(女)：这个女的身材看着倒是不错，不如就赏给他们玩玩吧。{温柔}  \n旁白：下一秒，赵晏池宠溺的声音响起。{自然讲述}  \n赵晏池(男)：思月，还是你小主意最多。{温柔}  \n旁白：听到这个有些耳熟的名字，我努力抬起肿起的眼皮。{自然讲述}  \n旁白：竟然是她。{自然讲述}  \n旁白：汪思月，赵晏池的初恋。{自然讲述}  \n旁白：刚在一起的时候我就听过这个名字。{自然讲述}  \n旁白：可那时他信誓旦旦地和我保证，他们已经是过去式了。{自然讲述}  \n旁白：他的心里只有我一个人。{自然讲述}  \n旁白：不等我想太多，赵晏池下一句话像一道惊雷劈下来。{自然讲述}  \n赵晏池(男)：好，就听你的。{冷漠}  \n旁白：他对那几个保镖淡然道：{自然讲述}  \n赵晏池(男)：她归你们了，别玩死，死在这儿太晦气。{冷漠}  \n旁白：保镖的脸上露出欣喜而猥琐的笑容。{自然讲述}  \n旁白：我拼命摇头，张开嘴想告诉他们我的真实身份。{自然讲述}  \n旁白：可药物作用让我发不出一个完整的音节。{自然讲述}  \n旁白：拼尽全力，我也只能呼出嗬哧嗬哧的气声。{自然讲述}  \n旁白：他们摩拳擦掌着靠近我。{自然讲述}  \n旁白：拖着死鱼一样的身体，我吃力地在地上匍匐，可这全然是徒劳。{自然讲述}  \n旁白：很快，我便被他们按住，压在身下。{自然讲述}  \n旁白：撕裂一般的疼痛占据了我的身体，生理性的恶心冲撞着我的五脏六腑。{自然讲述}  \n旁白：不多时，小腹处传来一阵坠痛。{自然讲述}  \n旁白：我眼睁睁看着自己身下晕开一片血迹。{自然讲述}  \n旁白：我知道，我的孩子终究是没保住。{自然讲述}  \n旁白：保镖愣了一瞬间后也反应过来。{自然讲述}  \n保镖(男)：这娘们儿还怀孕了？{惊讶}  \n保镖(男)：怀孕？{惊讶}  \n旁白：赵晏池听到这两个字蹙起眉。{自然讲述}  \n旁白：他似乎想到了什么，拿起手机发了条消息。{自然讲述}  \n旁白：我放在袋子里的手机响起轻微的提示音，可惜没人听见。{自然讲述}  \n旁白：他没有再多想：{自然讲述}  \n赵晏池(男)：你们继续吧。{冷漠}  \n旁白：我无神地盯着天花板，泪水糊满了整张脸。{自然讲述}  \n旁白：绝望将我包围，整个人都陷入深不见底的深渊。{自然讲述}"';
        // $text = '"旁白：刀尖刺穿手掌的瞬间，疼痛自掌心钻入骨髓。  \n旁白：心脏像是被万箭穿过一般，我痛得几近晕厥。  \n"';
        // $text = json_decode($text, true);
        // dd(handleScriptWords($text, 0));
        $text = $this->deepseekService->generateScriptWords($cid, 'r1');
        \Log::info('text: '.json_encode($text, 256));
        // $token = getTextTokens($text);
        $result = handleScriptWords($text);
        $role_gender = getProp($result, 'role_gender');
        $role_timbre = [];
        foreach ($role_gender as $role => $gender) {
            $timbre = DB::table('mp_timbres')->where('gender', $gender)->first();
            if (!$timbre) {
                $role_timbre[$role] = ['timbre_type' => 'zh_male_ruyayichen_emo_v2_mars_bigtts', 'timbre_name' => '儒雅男友'];
            }else {
                $timbre_name = str_replace('（多情感）', '', $timbre->timbre_name);
                $role_timbre[$role] = [
                    'timbre_type' => $timbre->timbre_type,
                    'timbre_name' => $timbre_name
                ];
            }
        }

        // 更新角色-音色信息
        $existed_role_info = DB::table('mp_book_version')->where('bid', $bid)->where('id', $version_id)->value('role_info');
        $existed_role_info = json_decode($existed_role_info, true);
        if ($existed_role_info) $existed_roles = array_keys($existed_role_info);
        else $existed_roles = [];
        foreach ($role_timbre as $role => $timbre) {
            if (!in_array($role, $existed_roles)) {
                $existed_role_info[$role] = $timbre;
            }
        }

        // 获取情感信息
        $emotion_list = DB::table('mp_emotion_list')->where('is_enabled', 1)->pluck('emotion_name', 'emotion_code')->toArray();
        $emotion_list = array_flip($emotion_list);

        // 构造生成音频的json
        $words = getProp($result, 'words');
        foreach($words as &$word) {
            $role = getProp($word, 'role');
            $word['gender'] = (int)$word['gender'];
            if (isset($emotion_list[getProp($word, 'emotion')])) {  // 如果有对应情感则赋值,没有则默认为中性(neutral)
                $word['emotion_type'] = $emotion_list[getProp($word, 'emotion')];
            }else {
                $word['emotion'] = '中性';
                $word['emotion_type'] = 'neutral';
            }
            $word['voice_name'] = $role_timbre[$role]['timbre_name'];
            $word['voice_type'] = $role_timbre[$role]['timbre_type'];
            $word['speed_ratio'] = mt_rand(9,11)/10;
            $word['loudness_ratio'] = mt_rand(5,12)/10;
            $word['emotion_scale'] = mt_rand(1,5);
        }
        $generate_json = json_encode($words, 256);
        \Log::info('generate_json: '.$generate_json);

        try {
            DB::beginTransaction();
            $role_info = json_encode($existed_role_info, 256);
            $boolen = DB::table('mp_book_version')->where('bid', $bid)->where('id', $version_id)->update(['role_info' => $role_info, 'updated_at' => date('Y-m-d H:i:s')]);
            if (!$boolen) {
                DB::rollBack();
                dd('更新角色信息失败');
            }

            $count = DB::table('mp_audio_tasks')->where('bid', $bid)->where('version_id', $version_id)->where('cid', $cid)->count('id');
            $chapter_audio = DB::table('mp_chapter_audios')->where('bid', $bid)->where('version_id', $version_id)->where('cid', $cid)->first();
            if (!$count) {
                $task_name = getProp($chapter_audio, 'book_name').' '.getProp($chapter_audio, 'chapter_name').'【'.getProp($chapter_audio, 'version_name').'】';
            }else {
                $task_name = getProp($chapter_audio, 'book_name').' '.getProp($chapter_audio, 'chapter_name').'【'.getProp($chapter_audio, 'version_name').'】('.($count+1).')';
            }
            $boolen1 = DB::table('mp_chapter_audios')->where('bid', $bid)->where('version_id', $version_id)->where('cid', $cid)->update(['generate_status'=>'执行中', 'generate_json' => $generate_json, 'updated_at' => date('Y-m-d H:i:s')]);
            if (!$boolen1) {
                DB::rollBack();
                dd('更新生成数据失败');
            }
            $boolen2 = DB::table('mp_audio_tasks')->insert([
                'audio_id'      => getProp($chapter_audio, 'id'),
                'status'        => '执行中',
                'generate_json' => $generate_json,
                'bid'           => $bid,
                'book_name'     => getProp($chapter_audio, 'book_name'),
                'version_id'    => $version_id,
                'version_name'  => getProp($chapter_audio, 'version_name'),
                'cid'           => $cid,
                'chapter_name'  => getProp($chapter_audio, 'chapter_name'),
                'task_name'     => $task_name,
                'created_at'    => date('Y-m-d H:i:s'),
                'updated_at'    => date('Y-m-d H:i:s')
            ]);
            if (!$boolen2) {
                DB::rollBack();
                dd('创建任务失败');
            }
        } catch (\Exception $e) {
            DB::rollBack();
            dd('失败');
        }
        DB::commit();
        \Log::info('~~~~~~~~~~~~~~~~~~~~~~~~结束~~~~~~~~~~~~~~~~~~~~~~~~');
        dd('成功!');
        // \Log::info('generate_json: '.$generate_json);
    }
}
