<?php

/**
 * 文件功能：五子棋对局记录表迁移
 *
 * 存储 PvP（玩家对战）和 PvE（人机对战）两种模式的对局信息，
 * 包含棋盘状态、落子历史、对局结果及奖励记录。
 *
 * @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
{
    /**
     * 创建 gomoku_games 表。
     */
    public function up(): void
    {
        Schema::create('gomoku_games', function (Blueprint $table) {
            $table->id();

            // 对战模式：pvp（玩家对玩家）| pve（人机对战）
            $table->string('mode', 10)->index();

            // 所在房间 ID（用于广播邀请和战报）
            $table->unsignedBigInteger('room_id')->index();

            // 黑棋玩家（先手，也是发起方）
            $table->unsignedBigInteger('player_black_id');

            // 白棋玩家（PvP 时为接受方，PvE 时为 null）
            $table->unsignedBigInteger('player_white_id')->nullable();

            // AI 难度：1=简单 2=普通 3=困难 4=专家（PvE 时使用）
            $table->tinyInteger('ai_level')->nullable();

            // 对局状态：waiting | playing | finished | cancelled
            $table->string('status', 20)->default('waiting')->index();

            // 15×15 棋盘状态（二维数组：0=空 1=黑 2=白）
            $table->json('board');

            // 当前行棋方：1=黑棋 2=白棋/AI
            $table->tinyInteger('current_turn')->default(1);

            // 胜者：1=黑棋胜 2=白棋/AI胜 0=平局 null=未结束
            $table->tinyInteger('winner')->nullable();

            // 落子历史（用于战绩回放）[{row, col, color, at}]
            $table->json('moves_history')->nullable();

            // 奖励金币（对局结束时写入，记录实际到账金额）
            $table->unsignedInteger('reward_gold')->default(0);

            // PvE 入场费（对局开始时扣除，平局/认输时结算）
            $table->unsignedInteger('entry_fee')->default(0);

            // 邀请过期时间（waiting 状态下，超时自动 cancelled）
            $table->timestamp('invite_expires_at')->nullable();

            // 对局开始时间
            $table->timestamp('started_at')->nullable();

            // 对局结束时间
            $table->timestamp('finished_at')->nullable();

            $table->timestamps();

            // 外键约束
            $table->foreign('room_id')->references('id')->on('rooms')->onDelete('cascade');
            $table->foreign('player_black_id')->references('id')->on('users')->onDelete('cascade');
            $table->foreign('player_white_id')->references('id')->on('users')->onDelete('cascade');
        });
    }

    /**
     * 回滚。
     */
    public function down(): void
    {
        Schema::dropIfExists('gomoku_games');
    }
};
