<?php

/**
 * 文件功能：创建用户积分流水表（user_currency_logs）
 * 记录所有用户经验/金币/魅力的变动来源与金额，支持今日排行与活动统计
 *
 * @author   ChatRoom Laravel
 *
 * @version  1.0.0
 */

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * 创建 user_currency_logs 表
     */
    public function up(): void
    {
        Schema::create('user_currency_logs', function (Blueprint $table) {
            $table->id();

            // 用户锚点：以 user_id 为不变标识，username 仅为当时的快照（用户可改名）
            $table->unsignedBigInteger('user_id')->index()->comment('用户 ID（不变锚点）');
            $table->string('username', 50)->comment('用户名快照（记录时的名称）');

            // 货币类型：exp=经验 / gold=金币 / charm=魅力
            $table->string('currency', 10)->comment('货币类型（exp/gold/charm）');

            // 变动量（正=增加，负=消耗）
            $table->integer('amount')->comment('变动量（正数=增加，负数=消耗）');

            // 变动后的余额快照（便于追溯异常）
            $table->integer('balance_after')->comment('变动后余额');

            // 来源标识（由 CurrencySource enum 管理，如 auto_save / fishing_gain / admin_adjust 等）
            $table->string('source', 30)->index()->comment('来源（CurrencySource 枚举值）');

            // 备注（可选，附加上下文信息）
            $table->string('remark', 200)->nullable()->comment('备注信息');

            // 发生房间（可选）
            $table->unsignedBigInteger('room_id')->nullable()->comment('操作所在房间ID');

            // 只记录创建时间，流水不允许更新
            $table->timestamp('created_at')->nullable()->index()->comment('记录时间');

            // 复合索引：高效支持今日排行榜查询（按日期+货币+用户汇总）
            $table->index(['currency', 'created_at'], 'idx_currency_date');

            // 复合索引：高效支持用户个人日志查询
            $table->index(['user_id', 'currency', 'created_at'], 'idx_user_currency_date');

            // 复合索引：高效支持活动来源统计
            $table->index(['source', 'currency', 'created_at'], 'idx_source_currency_date');
        });
    }

    /**
     * 回滚：删除流水表
     */
    public function down(): void
    {
        Schema::dropIfExists('user_currency_logs');
    }
};
