<?php

/**
 * 文件功能：自动存点命令功能测试
 *
 * 覆盖定时自动存点私信内容，确保用户身份信息展示完整。
 */

namespace Tests\Feature;

use App\Events\MessageSent;
use App\Models\Department;
use App\Models\Position;
use App\Models\Room;
use App\Models\Sysparam;
use App\Models\User;
use App\Models\UserPosition;
use App\Models\VipLevel;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Redis;
use Tests\TestCase;

/**
 * 类功能：验证自动存点命令推送给用户的状态通知内容。
 */
class AutoSaveExpCommandTest extends TestCase
{
    use RefreshDatabase;

    /**
     * 每个测试前清空 Redis 与配置缓存，避免在线状态和系统参数串扰。
     */
    protected function setUp(): void
    {
        parent::setUp();

        Redis::flushall();
        Cache::flush();
    }

    /**
     * 测试自动存点私信会展示部门、职务与会员信息。
     */
    public function test_auto_save_notice_includes_department_position_and_vip_identity(): void
    {
        Event::fake([MessageSent::class]);

        Sysparam::updateOrCreate(['alias' => 'exp_per_heartbeat'], ['body' => '0']);
        Sysparam::updateOrCreate(['alias' => 'jjb_per_heartbeat'], ['body' => '0']);
        Sysparam::updateOrCreate(['alias' => 'superlevel'], ['body' => '100']);
        Cache::flush();

        $room = Room::create(['room_name' => 'asave']);
        $vipLevel = VipLevel::factory()->create([
            'name' => '至尊会员',
            'icon' => '👑',
        ]);
        $user = User::factory()->create([
            'username' => 'autosave-user',
            'user_level' => 100,
            'exp_num' => 168762,
            'jjb' => 1100017,
            'vip_level_id' => $vipLevel->id,
            'hy_time' => now()->addDay(),
        ]);
        $department = Department::create([
            'name' => '办公厅',
            'rank' => 100,
            'color' => '#1d4ed8',
            'sort_order' => 1,
        ]);
        $position = Position::create([
            'department_id' => $department->id,
            'name' => '厅长',
            'icon' => '🏛️',
            'rank' => 100,
            'level' => 100,
            'sort_order' => 1,
        ]);
        UserPosition::create([
            'user_id' => $user->id,
            'position_id' => $position->id,
            'appointed_at' => now(),
            'is_active' => true,
        ]);

        Redis::hset("room:{$room->id}:users", $user->username, json_encode(['username' => $user->username], JSON_UNESCAPED_UNICODE));

        $this->artisan('chatroom:auto-save-exp')->assertSuccessful();

        $messages = collect(Redis::lrange("room:{$room->id}:messages", 0, -1))
            ->map(fn (string $message): array => json_decode($message, true));
        $notice = $messages->first(fn (array $message): bool => ($message['to_user'] ?? '') === $user->username);

        $this->assertIsArray($notice);
        $this->assertStringContainsString('部门 办公厅 · 职务 🏛️ 厅长 · 会员 👑 至尊会员', $notice['content']);
        $this->assertStringContainsString('LV.100 · 经验 168762 · 金币 1100017 · 已满级 ✓', $notice['content']);
    }
}
