<?php

use App\Core\Auth;
use App\Core\Csrf;

if (!($auth instanceof Auth) || !$auth->can('roles.manage')) {
    http_response_code(403);
    echo 'غير مسموح بالوصول إلى إدارة الصلاحيات';
    return;
}

$action = $_GET['action'] ?? 'index';

try {
    $db->exec(
        "CREATE TABLE IF NOT EXISTS permissions (
            id INT AUTO_INCREMENT PRIMARY KEY,
            code VARCHAR(100) NOT NULL UNIQUE,
            name VARCHAR(150) NOT NULL
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"
    );
    $db->exec(
        "CREATE TABLE IF NOT EXISTS role_permissions (
            role_id INT NOT NULL,
            permission_id INT NOT NULL,
            PRIMARY KEY (role_id, permission_id)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"
    );
} catch (Throwable $e) {
}

$modulesPermissions = [
    'المرضى' => [
        'patients.view' => 'إدارة المرضى',
        'patients.create' => 'إضافة المرضى',
        'patients.delete' => 'حذف المرضى'
    ],
    'الأطباء' => [
        'doctors.view' => 'إدارة الأطباء',
        'doctors.create' => 'إضافة الأطباء',
        'doctors.update' => 'تعديل الأطباء',
        'doctors.delete' => 'حذف الأطباء'
    ],
    'التحاليل' => [
        'tests.view' => 'إدارة التحاليل',
        'tests.create' => 'إضافة التحاليل',
        'tests.update' => 'تعديل التحاليل',
        'tests.delete' => 'حذف التحاليل'
    ],
    'الطلبات والفواتير' => [
        'orders.view' => 'إدارة الطلبات',
        'orders.create' => 'إضافة الطلبات',
        'billing.view' => 'إدارة الفواتير',
        'billing.create' => 'إضافة الفواتير'
    ],
    'النتائج' => [
        'results.view' => 'عرض النتائج',
        'results.edit' => 'تعديل النتائج',
        'results.print' => 'طباعة النتائج',
        'results.validate' => 'اعتماد النتائج',
        'results.delete' => 'حذف النتائج'
    ],
    'الفروع' => [
        'branches.view' => 'عرض الفروع',
        'branches.manage' => 'إدارة الفروع'
    ],
    'المخزون' => [
        'inventory.view' => 'إدارة المخزون',
        'inventory.manage' => 'إدارة حركات المخزون'
    ],
    'التقارير وقائمة العمل' => [
        'reports.view' => 'عرض التقارير',
        'worklist.view' => 'قائمة العمل'
    ],
    'ضبط الجودة' => [
        'quality.manage' => 'إدارة ضبط الجودة'
    ],
    'تكامل الأجهزة' => [
        'integration.manage' => 'إدارة تكامل الأجهزة'
    ],
    'الإعدادات والأمان' => [
        'settings.manage' => 'إدارة الإعدادات',
        'security.view' => 'عرض الأمان والامتثال'
    ],
    'المستخدمون' => [
        'users.manage' => 'إدارة المستخدمين',
        'roles.manage' => 'إدارة الصلاحيات'
    ],
    'سجل التدقيق والدعم' => [
        'audit_log.view' => 'عرض سجل التدقيق',
        'support_tickets.view' => 'الدعم الفني'
    ],
    'إخفاء البيانات' => [
        'data.mask_results' => 'إخفاء النتائج (الاستقبال يشوف الاسم فقط)'
    ]
];

if ($action === 'create' && $_SERVER['REQUEST_METHOD'] === 'POST') {
    Csrf::enforce($_POST['_csrf'] ?? null);
    $name = trim($_POST['name'] ?? '');
    if ($name !== '') {
        $stmt = $db->prepare('INSERT INTO roles (name) VALUES (:name)');
        $stmt->execute(['name' => $name]);
        header('Location: index.php?page=roles');
        exit;
    }
}

if ($action === 'delete' && $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['id'])) {
    Csrf::enforce($_POST['_csrf'] ?? null);
    $id = (int)$_POST['id'];
    if ($id > 0 && $id !== 1) {
        $stmt = $db->prepare('DELETE FROM role_permissions WHERE role_id = :id');
        $stmt->execute(['id' => $id]);
        $stmt = $db->prepare('DELETE FROM roles WHERE id = :id');
        $stmt->execute(['id' => $id]);
    }
    header('Location: index.php?page=roles');
    exit;
}

if ($action === 'edit' && isset($_GET['id'])) {
    $roleId = (int)$_GET['id'];
    if ($roleId <= 0) {
        header('Location: index.php?page=roles');
        exit;
    }

    foreach ($modulesPermissions as $group) {
        foreach ($group as $code => $label) {
            $stmt = $db->prepare('SELECT id FROM permissions WHERE code = :code LIMIT 1');
            $stmt->execute(['code' => $code]);
            $perm = $stmt->fetch();
            if (!$perm) {
                $stmt = $db->prepare('INSERT INTO permissions (code, name) VALUES (:code, :name)');
                $stmt->execute(['code' => $code, 'name' => $label]);
            }
        }
    }

    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        Csrf::enforce($_POST['_csrf'] ?? null);
        $selected = $_POST['permissions'] ?? [];
        if (!is_array($selected)) {
            $selected = [];
        }

        $stmt = $db->prepare('DELETE rp FROM role_permissions rp JOIN permissions p ON p.id = rp.permission_id WHERE rp.role_id = :role_id');
        $stmt->execute(['role_id' => $roleId]);

        if ($selected) {
            $inCodes = array_values($selected);
            $placeholders = implode(',', array_fill(0, count($inCodes), '?'));
            $stmt = $db->prepare("SELECT id, code FROM permissions WHERE code IN ($placeholders)");
            $stmt->execute($inCodes);
            $codeToId = [];
            foreach ($stmt->fetchAll() as $row) {
                $codeToId[$row['code']] = (int)$row['id'];
            }

            $stmtInsert = $db->prepare('INSERT INTO role_permissions (role_id, permission_id) VALUES (:role_id, :permission_id)');
            foreach ($inCodes as $code) {
                if (isset($codeToId[$code])) {
                    $stmtInsert->execute([
                        'role_id' => $roleId,
                        'permission_id' => $codeToId[$code]
                    ]);
                }
            }
        }

        header('Location: index.php?page=roles');
        exit;
    }

    $stmt = $db->prepare('SELECT name FROM roles WHERE id = :id');
    $stmt->execute(['id' => $roleId]);
    $role = $stmt->fetch();
    if (!$role) {
        header('Location: index.php?page=roles');
        exit;
    }

    $stmt = $db->prepare(
        'SELECT p.code
         FROM role_permissions rp
         JOIN permissions p ON p.id = rp.permission_id
         WHERE rp.role_id = :role_id'
    );
    $stmt->execute(['role_id' => $roleId]);
    $current = [];
    foreach ($stmt->fetchAll() as $row) {
        $current[] = $row['code'];
    }

    ?>
    <div class="page-header">
        <h1>تعديل الصلاحية للدور: <?php echo htmlspecialchars($role['name'], ENT_QUOTES, 'UTF-8'); ?></h1>
    </div>
    <div class="section-card roles-edit-card">
        <form method="post" class="roles-permissions-form">
            <input type="hidden" name="_csrf" value="<?php echo htmlspecialchars(Csrf::token(), ENT_QUOTES, 'UTF-8'); ?>">
            <div class="roles-section">
                <h3 class="roles-section-title">العمليات اليومية</h3>
                <div class="roles-section-grid">
                    <?php foreach (['المرضى','الأطباء','التحاليل','الطلبات والفواتير','النتائج'] as $g): if (!isset($modulesPermissions[$g])) continue; $perms = $modulesPermissions[$g]; ?>
                    <div class="roles-perm-group">
                        <div class="roles-perm-title"><?php echo htmlspecialchars($g, ENT_QUOTES, 'UTF-8'); ?></div>
                        <?php foreach ($perms as $code => $label): ?>
                        <label class="settings-checkbox"><input type="checkbox" name="permissions[]" value="<?php echo htmlspecialchars($code, ENT_QUOTES, 'UTF-8'); ?>" <?php echo in_array($code, $current, true) ? 'checked' : ''; ?>> <?php echo htmlspecialchars($label, ENT_QUOTES, 'UTF-8'); ?></label>
                        <?php endforeach; ?>
                    </div>
                    <?php endforeach; ?>
                </div>
            </div>
            <div class="roles-section">
                <h3 class="roles-section-title">الدعم والتكامل</h3>
                <div class="roles-section-grid">
                    <?php foreach (['الفروع','المخزون','التقارير وقائمة العمل','ضبط الجودة','تكامل الأجهزة'] as $g): if (!isset($modulesPermissions[$g])) continue; $perms = $modulesPermissions[$g]; ?>
                    <div class="roles-perm-group">
                        <div class="roles-perm-title"><?php echo htmlspecialchars($g, ENT_QUOTES, 'UTF-8'); ?></div>
                        <?php foreach ($perms as $code => $label): ?>
                        <label class="settings-checkbox"><input type="checkbox" name="permissions[]" value="<?php echo htmlspecialchars($code, ENT_QUOTES, 'UTF-8'); ?>" <?php echo in_array($code, $current, true) ? 'checked' : ''; ?>> <?php echo htmlspecialchars($label, ENT_QUOTES, 'UTF-8'); ?></label>
                        <?php endforeach; ?>
                    </div>
                    <?php endforeach; ?>
                </div>
            </div>
            <div class="roles-section">
                <h3 class="roles-section-title">إدارة النظام</h3>
                <div class="roles-section-grid">
                    <?php foreach (['الإعدادات والأمان','المستخدمون','سجل التدقيق والدعم','إخفاء البيانات'] as $g): if (!isset($modulesPermissions[$g])) continue; $perms = $modulesPermissions[$g]; ?>
                    <div class="roles-perm-group">
                        <div class="roles-perm-title"><?php echo htmlspecialchars($g, ENT_QUOTES, 'UTF-8'); ?></div>
                        <?php foreach ($perms as $code => $label): ?>
                        <label class="settings-checkbox"><input type="checkbox" name="permissions[]" value="<?php echo htmlspecialchars($code, ENT_QUOTES, 'UTF-8'); ?>" <?php echo in_array($code, $current, true) ? 'checked' : ''; ?>> <?php echo htmlspecialchars($label, ENT_QUOTES, 'UTF-8'); ?></label>
                        <?php endforeach; ?>
                    </div>
                    <?php endforeach; ?>
                </div>
            </div>
            <div class="roles-form-actions">
                <button type="submit" class="btn-primary">حفظ الصلاحيات</button>
                <button type="button" id="rolesSelectAll" class="btn-secondary">تحديد الكل</button>
                <button type="button" id="rolesDeselectAll" class="btn-secondary">إلغاء الكل</button>
                <a href="index.php?page=roles" class="btn-secondary">رجوع</a>
            </div>
        </form>
    </div>
    <script>
    (function(){
        var btnAll = document.getElementById('rolesSelectAll');
        var btnNone = document.getElementById('rolesDeselectAll');
        var form = btnAll && btnAll.closest('form');
        if (!form) return;
        if (btnAll) btnAll.onclick = function(){ form.querySelectorAll('input[name="permissions[]"]').forEach(function(cb){ cb.checked = true; }); };
        if (btnNone) btnNone.onclick = function(){ form.querySelectorAll('input[name="permissions[]"]').forEach(function(cb){ cb.checked = false; }); };
    })();
    </script>
    <?php
    return;
}

$roles = [];

try {
    $stmt = $db->query('SELECT id, name FROM roles ORDER BY id');
    $roles = $stmt->fetchAll();
} catch (Throwable $e) {
}
?>
<div class="page-header page-header--stack">
    <div class="page-header-top">
        <h1>الصلاحيات والأدوار</h1>
        <div class="actions-bar">
            <form method="post" action="index.php?page=roles&action=create" style="display:flex;gap:8px;align-items:center;">
                <input type="hidden" name="_csrf" value="<?php echo htmlspecialchars(Csrf::token(), ENT_QUOTES, 'UTF-8'); ?>">
                <input type="text" name="name" placeholder="اسم دور جديد" required>
                <button type="submit" class="btn-primary">إضافة دور</button>
            </form>
        </div>
    </div>
    <p class="page-header-desc">تعريف الأدوار وربط الصلاحيات الدقيقة بكل ميزة في النظام. يُنصح بعدم تعديل دور المدير الأساسي إلا عند الحاجة.</p>
    <nav class="lab-quick-nav" aria-label="اختصارات ذات صلة">
        <?php if ($auth->can('users.manage')): ?><a href="index.php?page=users">المستخدمون</a><?php endif; ?>
        <?php if ($auth->can('security.view')): ?><a href="index.php?page=security">الأمان</a><?php endif; ?>
    </nav>
</div>
<div class="table-wrapper">
<table class="table">
    <thead>
        <tr>
            <th>#</th>
            <th>اسم الدور</th>
            <th>الإجراءات</th>
        </tr>
    </thead>
    <tbody>
    <?php foreach ($roles as $r): ?>
        <tr>
            <td><?php echo (int)$r['id']; ?></td>
            <td><?php echo htmlspecialchars($r['name'], ENT_QUOTES, 'UTF-8'); ?></td>
            <td>
                <a href="index.php?page=roles&action=edit&id=<?php echo (int)$r['id']; ?>">تعديل الصلاحيات</a>
                <?php if ((int)$r['id'] !== 1): ?>
                    <form method="post" action="index.php?page=roles&action=delete" style="display:inline;" onsubmit="return confirm('هل أنت متأكد من حذف هذا الدور؟');">
                        <input type="hidden" name="_csrf" value="<?php echo htmlspecialchars(Csrf::token(), ENT_QUOTES, 'UTF-8'); ?>">
                        <input type="hidden" name="id" value="<?php echo (int)$r['id']; ?>">
                        <button type="submit" class="btn-link">حذف</button>
                    </form>
                <?php endif; ?>
            </td>
        </tr>
    <?php endforeach; ?>
    </tbody>
</table>
</div>
