<?php

/**
 * 文件功能：创建用户职务关联表迁移
 * 记录每个用户的当前在职职务及全部历史任职记录（职务履历核心表）
 * is_active=true 表示当前在职，false 表示历史记录（永久保留）
 *
 * @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
{
    /**
     * 创建用户职务关联表
     */
    public function up(): void
    {
        Schema::create('user_positions', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')
                ->constrained('users')
                ->cascadeOnDelete()
                ->comment('用户 ID');
            $table->foreignId('position_id')
                ->constrained('positions')
                ->cascadeOnDelete()
                ->comment('职务 ID');

            // 任命信息
            $table->unsignedBigInteger('appointed_by_user_id')->nullable()->comment('任命人 user_id（null=系统初始化）');
            $table->timestamp('appointed_at')->comment('任命时间');
            $table->string('remark', 255)->nullable()->comment('任命备注');

            // 撤销信息
            $table->timestamp('revoked_at')->nullable()->comment('撤销时间（null=仍在职）');
            $table->unsignedBigInteger('revoked_by_user_id')->nullable()->comment('撤销人 user_id');

            // 状态：true=当前在职；false=历史记录
            $table->boolean('is_active')->default(true)->index()->comment('是否当前在职');

            $table->timestamps();

            // 同一用户同一时刻只能有一条在职记录（通过业务层保证，索引辅助查询）
            $table->index(['user_id', 'is_active']);
            $table->index(['position_id', 'is_active']);

            // 外键约束（任命人/撤销人）
            $table->foreign('appointed_by_user_id')->references('id')->on('users')->nullOnDelete();
            $table->foreign('revoked_by_user_id')->references('id')->on('users')->nullOnDelete();
        });
    }

    /**
     * 回滚：删除用户职务关联表
     */
    public function down(): void
    {
        Schema::dropIfExists('user_positions');
    }
};
