<?php

use Illuminate\Database\Migrations\Migration;
use Spatie\Permission\Models\Permission;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        // 权限名称映射（旧名称 => 新名称）
        $permissionMapping = [
            // 文档管理
            'document.viewAny' => 'document.view',
            
            // 系统设置
            'system-setting.viewAny' => 'system-setting.view',
            
            // 操作日志
            'activity-log.viewAny' => 'activity-log.view',
            
            // 终端管理
            'terminal.viewAny' => 'terminal.view',
            
            // SOP模板
            'sop-template.viewAny' => 'sop-template.view',
            
            // 分组管理
            'group.viewAny' => 'group.view',
            
            // 用户管理
            'user.viewAny' => 'user.view',
            
            // 角色管理
            'role.viewAny' => 'role.view',
        ];

        foreach ($permissionMapping as $oldName => $newName) {
            $oldPermission = Permission::where('name', $oldName)->first();
            
            if ($oldPermission) {
                // 检查新权限是否已存在
                $newPermission = Permission::where('name', $newName)->first();
                
                if (!$newPermission) {
                    // 如果新权限不存在，直接重命名
                    $oldPermission->name = $newName;
                    $oldPermission->save();
                } else {
                    // 如果新权限已存在，需要合并权限关联
                    // 将旧权限的所有角色关联转移到新权限
                    $roles = $oldPermission->roles;
                    foreach ($roles as $role) {
                        if (!$role->hasPermissionTo($newName)) {
                            $role->givePermissionTo($newName);
                        }
                    }
                    
                    // 将旧权限的所有用户关联转移到新权限
                    $users = $oldPermission->users;
                    foreach ($users as $user) {
                        if (!$user->hasPermissionTo($newName)) {
                            $user->givePermissionTo($newName);
                        }
                    }
                    
                    // 删除旧权限
                    $oldPermission->delete();
                }
            }
        }

        // 删除不再需要的详情查看权限
        $detailPermissions = [
            'document.view',
            'system-setting.view',
            'activity-log.view',
            'terminal.view',
            'sop-template.view',
            'group.view',
            'user.view',
            'role.view',
        ];

        foreach ($detailPermissions as $permName) {
            // 只删除描述为"查看xxx详情"的权限（如果存在重复）
            $permissions = Permission::where('name', $permName)->get();
            if ($permissions->count() > 1) {
                // 保留第一个，删除其他
                $permissions->skip(1)->each(function ($permission) {
                    $permission->delete();
                });
            }
        }

        // 清除权限缓存
        app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        // 不支持回滚，因为权限合并后无法准确还原
    }
};
