<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;

return new class extends Migration
{
    public function up(): void
    {
        $now = now();
        $roles = [
            ['name' => 'admin', 'display_name' => 'ادمین', 'description' => 'دسترسی کامل به تمام بخش‌های سیستم'],
            ['name' => 'project_manager', 'display_name' => 'مدیر پروژه', 'description' => 'مدیریت پروژه‌ها، وظایف و تیم‌ها'],
            ['name' => 'product_manager', 'display_name' => 'مدیر محصول', 'description' => 'مدیریت بک‌لاگ، اولویت‌ها و گزارش محصول'],
            ['name' => 'scrum_master', 'display_name' => 'اسکرام مستر', 'description' => 'مدیریت اسپرینت‌ها، جلسات و پیگیری تیم'],
            ['name' => 'specialist', 'display_name' => 'کارشناس', 'description' => 'دسترسی پایه برای انجام وظایف محوله'],
            ['name' => 'team_member', 'display_name' => 'کارشناس', 'description' => 'دسترسی پایه برای انجام وظایف محوله'],
            ['name' => 'observer', 'display_name' => 'ناظر', 'description' => 'دسترسی مشاهده گزارشات و داشبورد'],
            ['name' => 'ceo', 'display_name' => 'مدیر عامل', 'description' => 'دسترسی مشاهده سطح بالا برای مدیران ارشد'],
        ];

        foreach ($roles as $role) {
            DB::table('roles')->updateOrInsert(
                ['name' => $role['name']],
                [
                    'display_name' => $role['display_name'],
                    'description' => $role['description'],
                    'guard_name' => 'web',
                    'created_at' => $now,
                    'updated_at' => $now,
                ]
            );
        }

        $roleIds = DB::table('roles')->pluck('id', 'name');
        $permissionIds = DB::table('permissions')->pluck('id', 'name');
        $syncRole = function (string $roleName, array $modules, array $actions) use ($roleIds, $permissionIds, $now) {
            if (! $roleIds->has($roleName)) {
                return;
            }

            foreach ($permissionIds as $permissionName => $permissionId) {
                [$module, $action] = explode('.', $permissionName);
                if (! in_array($module, $modules, true) || ! in_array($action, $actions, true)) {
                    continue;
                }

                DB::table('permission_role')->updateOrInsert(
                    ['role_id' => $roleIds[$roleName], 'permission_id' => $permissionId],
                    ['created_at' => $now, 'updated_at' => $now]
                );
            }
        };

        $syncRole('product_manager', ['projects', 'tasks', 'backlog', 'reports', 'comments', 'notifications'], ['view', 'create', 'edit', 'approve', 'reject', 'comment', 'report', 'export']);
        $syncRole('scrum_master', ['projects', 'tasks', 'sprints', 'meetings', 'reports', 'team', 'comments', 'notifications'], ['view', 'create', 'edit', 'assign', 'comment', 'report']);
        $syncRole('specialist', ['tasks', 'meetings', 'files', 'comments', 'notifications'], ['view', 'create', 'edit', 'comment', 'upload']);
        $syncRole('specialist', ['projects', 'sprints', 'backlog', 'team'], ['view']);
    }

    public function down(): void
    {
        $roleIds = DB::table('roles')->whereIn('name', ['product_manager', 'scrum_master', 'specialist'])->pluck('id');
        DB::table('permission_role')->whereIn('role_id', $roleIds)->delete();
        DB::table('roles')->whereIn('name', ['product_manager', 'scrum_master', 'specialist'])->delete();
        DB::table('roles')->where('name', 'admin')->update(['display_name' => 'مدیر سیستم']);
        DB::table('roles')->where('name', 'ceo')->update(['display_name' => 'مدیرعامل']);
        DB::table('roles')->where('name', 'team_member')->update(['display_name' => 'عضو تیم']);
    }
};
