<?php
declare(strict_types=1);

require_once __DIR__ . '/../magic/session_config.php';
bdr_start_session();

if (empty($_SESSION['user_id'])) {
    header('Location: ../logout.php');
    exit;
}

require_once __DIR__ . '/../magic/DataBase.php';

$database = new DataBase();
$db = $database->getConnection();
$db->exec('SET NAMES utf8mb4');

if (!audit_report_user_can_view($db)) {
    http_response_code(403);
    echo 'غير مصرح بعرض سجل التعديلات';
    exit;
}

$historyReady = audit_history_table_exists($db);
$tableOptions = $historyReady ? audit_distinct_tables($db) : array();
$userOptions = $historyReady ? audit_distinct_users($db) : array();

$today = date('Y-m-d');

$filters = array(
    'table' => trim((string) ($_GET['table'] ?? '')),
    'action' => trim((string) ($_GET['action'] ?? '')),
    'user' => trim((string) ($_GET['user'] ?? '')),
    'date_from' => trim((string) ($_GET['date_from'] ?? $today)),
    'date_to' => trim((string) ($_GET['date_to'] ?? $today)),
);

if (!in_array($filters['action'], array('', 'INSERT', 'UPDATE', 'DELETE'), true)) {
    $filters['action'] = '';
}

if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $filters['date_from'])) {
    $filters['date_from'] = $today;
}

if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $filters['date_to'])) {
    $filters['date_to'] = $today;
}

$summary = array('total' => 0, 'tables_count' => 0, 'users_count' => 0);
$tableSummary = array();
$historyRows = array();

if ($historyReady) {
    [$whereSql, $params] = audit_filter_sql($filters);
    $summary = audit_summary($db, $whereSql, $params);
    $tableSummary = audit_table_summary($db, $whereSql, $params);
    $historyRows = audit_history_rows($db, $whereSql, $params);
}

$actionLabels = array(
    'INSERT' => 'إضافة',
    'UPDATE' => 'تعديل',
    'DELETE' => 'حذف',
);

?>
<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>تقرير سجل التعديلات</title>
    <style>
        :root {
            --ink: #17212b;
            --muted: #627d98;
            --line: #d9e2ec;
            --soft: #f4f7f9;
            --green: #126c66;
            --blue: #1f5f99;
            --red: #b42318;
            --amber: #9a5b00;
        }
        * { box-sizing: border-box; }
        body {
            margin: 0;
            background: var(--soft);
            color: var(--ink);
            font-family: Tahoma, Arial, sans-serif;
            line-height: 1.45;
        }
        .page {
            width: min(1240px, calc(100% - 24px));
            margin: 14px auto 28px;
        }
        .topbar {
            display: flex;
            align-items: flex-start;
            justify-content: space-between;
            gap: 18px;
            margin-bottom: 12px;
        }
        h1, h2, h3 { margin: 0; }
        h1 { font-size: 23px; }
        h2 { font-size: 18px; }
        h3 { font-size: 15px; }
        .lead { margin: 5px 0 0; color: var(--muted); font-size: 13px; }
        .toolbar { display: flex; gap: 8px; flex-wrap: wrap; }
        .btn {
            border: 0;
            border-radius: 6px;
            padding: 7px 12px;
            cursor: pointer;
            font-weight: bold;
            text-decoration: none;
            display: inline-flex;
            align-items: center;
            justify-content: center;
            min-height: 34px;
        }
        .btn-primary { background: var(--green); color: #fff; }
        .btn-light { background: #fff; color: var(--ink); border: 1px solid var(--line); }
        .filters {
            background: #fff;
            border: 1px solid var(--line);
            border-radius: 8px;
            padding: 10px;
            display: grid;
            grid-template-columns: repeat(6, minmax(120px, 1fr));
            gap: 8px;
            margin-bottom: 10px;
        }
        label { display: block; color: var(--muted); font-size: 12px; margin-bottom: 4px; }
        select, input[type="date"] {
            width: 100%;
            height: 34px;
            border: 1px solid #bcccdc;
            border-radius: 6px;
            padding: 6px 8px;
            background: #fff;
            color: var(--ink);
        }
        .filter-actions { display: flex; gap: 8px; align-items: end; }
        .summary {
            display: grid;
            grid-template-columns: repeat(3, minmax(0, 1fr));
            gap: 6px;
            margin-bottom: 8px;
        }
        .metric {
            background: #fff;
            border: 1px solid var(--line);
            border-radius: 8px;
            padding: 7px 10px;
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 8px;
            min-height: 38px;
        }
        .metric strong { display: inline; font-size: 20px; line-height: 1.1; }
        .metric span { color: var(--muted); font-size: 12px; white-space: nowrap; }
        .section {
            background: #fff;
            border: 1px solid var(--line);
            border-radius: 8px;
            padding: 10px;
            margin-bottom: 10px;
        }
        .summary-table, .diff {
            width: 100%;
            border-collapse: collapse;
        }
        th, td {
            border-bottom: 1px solid var(--line);
            padding: 6px 7px;
            vertical-align: top;
            text-align: right;
        }
        th { background: #f8fafc; color: #334e68; font-size: 12px; }
        th small {
            display: block;
            direction: ltr;
            color: var(--muted);
            font-weight: normal;
            font-size: 10px;
            margin-top: 1px;
        }
        tr:last-child td { border-bottom: 0; }
        .event {
            background: #fff;
            border: 1px solid var(--line);
            border-radius: 8px;
            margin-bottom: 9px;
            overflow: hidden;
        }
        .event-head {
            display: grid;
            grid-template-columns: minmax(0, 1fr) auto;
            align-items: start;
            gap: 6px 12px;
            padding: 8px 10px;
            border-bottom: 1px solid var(--line);
            background: #fbfdff;
        }
        .event-main { min-width: 0; }
        .event-title {
            display: flex;
            align-items: center;
            gap: 7px;
            flex-wrap: wrap;
        }
        .event-title h3 { line-height: 1.35; }
        .badge {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            min-width: 64px;
            border-radius: 999px;
            padding: 2px 7px;
            color: #fff;
            font-size: 12px;
            font-weight: bold;
        }
        .badge.insert { background: var(--green); }
        .badge.update { background: var(--blue); }
        .badge.delete { background: var(--red); }
        .meta, .actor { color: var(--muted); font-size: 12px; }
        .meta {
            display: flex;
            flex-wrap: wrap;
            gap: 2px 8px;
            margin-top: 4px;
        }
        .actor {
            min-width: 170px;
            text-align: right;
            line-height: 1.5;
        }
        .actor b { color: var(--ink); }
        .diff-wrap { padding: 0 10px 8px; }
        .diff-list { width: 100%; }
        .diff-item {
            border-top: 1px solid var(--line);
            padding: 7px 0;
        }
        .diff-item:first-child { border-top: 0; }
        .diff-field {
            font-weight: bold;
            color: #334e68;
            margin-bottom: 5px;
        }
        .diff-values {
            display: grid;
            grid-template-columns: repeat(2, minmax(0, 1fr));
            gap: 8px;
        }
        .value-box {
            border: 1px solid var(--line);
            border-radius: 6px;
            overflow: hidden;
            min-width: 0;
        }
        .value-title {
            display: block;
            border-bottom: 1px solid var(--line);
            padding: 3px 6px;
            color: #334e68;
            background: rgba(255, 255, 255, 0.55);
            font-size: 11px;
            font-weight: bold;
        }
        .field { min-width: 145px; font-weight: bold; color: #334e68; }
        .label-ar, .field-ar { display: block; }
        .label-en, .field-en {
            display: block;
            direction: ltr;
            color: var(--muted);
            font-size: 11px;
            font-weight: normal;
            margin-top: 1px;
        }
        .table-code {
            direction: ltr;
            color: var(--muted);
            font-size: 10px;
            font-weight: normal;
        }
        .before { background: #fff7ed; }
        .after { background: #eefbf7; }
        .empty {
            color: var(--muted);
            font-style: normal;
        }
        .value {
            white-space: pre-wrap;
            word-break: break-word;
            max-width: 100%;
            padding: 6px;
        }
        .notice {
            border: 1px solid #f7c948;
            background: #fffbea;
            color: #513c06;
            border-radius: 8px;
            padding: 10px;
            margin-bottom: 10px;
        }
        @media screen and (max-width: 900px) {
            .topbar, .event-head { display: block; }
            .toolbar { margin-top: 12px; }
            .filters { grid-template-columns: 1fr; }
            .actor { text-align: right; min-width: 0; margin-top: 8px; }
        }
        @media print {
            @page { size: A4 portrait; margin: 7mm; }
            body { background: #fff; color: #000; font-size: 9.5px; line-height: 1.18; }
            .page { width: 100%; margin: 0; }
            .toolbar, .filters { display: none; }
            h1 { font-size: 16px; }
            h2 { font-size: 13px; }
            h3 { font-size: 11px; }
            .lead { display: none; }
            .topbar { margin-bottom: 4px; display: block; }
            .summary { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; gap: 4px; margin-bottom: 5px; page-break-inside: avoid; break-inside: avoid; }
            .metric {
                padding: 3px 5px;
                border-radius: 4px;
                display: flex;
                align-items: center;
                justify-content: center;
                gap: 6px;
                min-height: 24px;
            }
            .metric strong { display: inline; font-size: 13px; min-width: 22px; text-align: center; }
            .metric span { font-size: 9px; white-space: nowrap; }
            .section { padding: 5px; margin-bottom: 5px; }
            .event { margin-bottom: 5px; page-break-inside: auto; break-inside: auto; }
            .event-head { padding: 4px 6px; gap: 3px 8px; }
            .meta { gap: 1px 6px; margin-top: 2px; }
            .actor { min-width: 130px; line-height: 1.25; }
            .diff-wrap { padding: 0 5px 4px; }
            .diff-item { padding: 4px 0; }
            .diff-field { margin-bottom: 3px; }
            .diff-values { gap: 5px; }
            .value-title { padding: 2px 4px; font-size: 8px; }
            th, td { padding: 3px 4px; }
            th { font-size: 9px; }
            th small, .label-en, .field-en, .table-code { font-size: 8px; }
            .meta, .actor { font-size: 9px; }
            .badge { min-width: 42px; font-size: 9px; padding: 1px 5px; }
            .value { max-width: none; padding: 4px; font-size: 9px; line-height: 1.2; }
            a { color: #000; text-decoration: none; }
        }
    </style>
</head>
<body>
<main class="page">
    <header class="topbar">
        <div>
            <h1>تقرير سجل التعديلات</h1>
            <p class="lead">عرض مختصر لكل تغيير: الجدول، السجل، المستخدم، الوقت، IP، والقيمة قبل وبعد.</p>
        </div>
        <div class="toolbar">
            <button class="btn btn-primary" type="button" onclick="window.print()">تصدير PDF</button>
            <a class="btn btn-light" href="../profile.php">العودة للرئيسية</a>
        </div>
    </header>

    <?php if (!$historyReady): ?>
        <div class="notice">
            لم يتم إنشاء جدول سجل التعديلات بعد. افتح صفحة التثبيت وشغلها مرة واحدة:
            <a href="../tools/install_data_history.php">تثبيت سجل التعديلات</a>
        </div>
    <?php else: ?>
        <form class="filters" method="get">
            <div>
                <label for="table">اسم الجدول</label>
                <select id="table" name="table">
                    <option value="">كل الجداول</option>
                    <?php foreach ($tableOptions as $table): ?>
                        <option value="<?php echo h($table); ?>" <?php echo $filters['table'] === $table ? 'selected' : ''; ?>>
                            <?php echo h(audit_table_label($table)); ?>
                        </option>
                    <?php endforeach; ?>
                </select>
            </div>
            <div>
                <label for="action">نوع الحركة</label>
                <select id="action" name="action">
                    <option value="">كل الحركات</option>
                    <?php foreach ($actionLabels as $action => $label): ?>
                        <option value="<?php echo h($action); ?>" <?php echo $filters['action'] === $action ? 'selected' : ''; ?>>
                            <?php echo h($label); ?>
                        </option>
                    <?php endforeach; ?>
                </select>
            </div>
            <div>
                <label for="user">المستخدم</label>
                <select id="user" name="user">
                    <option value="">كل المستخدمين</option>
                    <?php foreach ($userOptions as $user): ?>
                        <?php $userValue = (string) ($user['changed_by_user_id'] ?? ''); ?>
                        <option value="<?php echo h($userValue); ?>" <?php echo $filters['user'] === $userValue ? 'selected' : ''; ?>>
                            <?php echo h(($user['changed_by_name'] ?: 'غير معروف') . ($userValue !== '' ? ' #' . $userValue : '')); ?>
                        </option>
                    <?php endforeach; ?>
                </select>
            </div>
            <div>
                <label for="date_from">من تاريخ</label>
                <input id="date_from" type="date" name="date_from" value="<?php echo h($filters['date_from']); ?>">
            </div>
            <div>
                <label for="date_to">إلى تاريخ</label>
                <input id="date_to" type="date" name="date_to" value="<?php echo h($filters['date_to']); ?>">
            </div>
            <div class="filter-actions">
                <button class="btn btn-primary" type="submit">عرض</button>
                <a class="btn btn-light" href="history.php">مسح</a>
            </div>
        </form>

        <section class="summary">
            <div class="metric">
                <strong><?php echo number_format((int) $summary['total']); ?></strong>
                <span>إجمالي الحركات</span>
            </div>
            <div class="metric">
                <strong><?php echo number_format((int) $summary['tables_count']); ?></strong>
                <span>جداول التغييرات</span>
            </div>
            <div class="metric">
                <strong><?php echo number_format((int) $summary['users_count']); ?></strong>
                <span>المستخدمون</span>
            </div>
        </section>

        <section class="section">
            <h2>جدول التغيرات</h2>
            <table class="summary-table">
                <thead>
                <tr>
                    <th>اسم الجدول<small>table_name</small></th>
                    <th>إضافة<small>INSERT</small></th>
                    <th>تعديل<small>UPDATE</small></th>
                    <th>حذف<small>DELETE</small></th>
                    <th>الإجمالي<small>total</small></th>
                </tr>
                </thead>
                <tbody>
                <?php if (!$tableSummary): ?>
                    <tr><td colspan="5" class="empty">لا توجد تغييرات حسب الفلتر الحالي.</td></tr>
                <?php endif; ?>
                <?php foreach ($tableSummary as $row): ?>
                    <tr>
                        <td><?php echo audit_table_label_html($row['table_name']); ?></td>
                        <td><?php echo number_format((int) $row['insert_count']); ?></td>
                        <td><?php echo number_format((int) $row['update_count']); ?></td>
                        <td><?php echo number_format((int) $row['delete_count']); ?></td>
                        <td><?php echo number_format((int) $row['total']); ?></td>
                    </tr>
                <?php endforeach; ?>
                </tbody>
            </table>
        </section>

        <section>
            <?php if (!$historyRows): ?>
                <div class="notice">لا توجد حركات مسجلة حسب الفلتر الحالي.</div>
            <?php endif; ?>

            <?php foreach ($historyRows as $row): ?>
                <?php
                $oldData = audit_decode_json($row['old_data'] ?? '');
                $newData = audit_decode_json($row['new_data'] ?? '');
                $changes = audit_changes($oldData, $newData, $row['action_type']);
                $actionClass = strtolower((string) $row['action_type']);
                $actionText = $actionLabels[$row['action_type']] ?? $row['action_type'];
                ?>
                <article class="event">
                    <div class="event-head">
                        <div class="event-main">
                            <div class="event-title">
                                <span class="badge <?php echo h($actionClass); ?>"><?php echo h($actionText); ?></span>
                                <h3>جدول: <?php echo audit_table_label_html($row['table_name']); ?></h3>
                            </div>
                            <div class="meta">
                                رقم الحركة <span class="table-code">history_id</span>: <?php echo h((string) $row['history_id']); ?>
                                <?php if (!empty($row['record_pk'])): ?>
                                    | السجل <span class="table-code">record_pk</span>: <?php echo h($row['record_pk']); ?>
                                <?php endif; ?>
                                | التاريخ <span class="table-code">changed_at</span>: <?php echo h(audit_date_ymd($row['changed_at'])); ?>
                                | الوقت: <?php echo h(audit_time_hm($row['changed_at'])); ?>
                            </div>
                        </div>
                        <div class="actor">
                            المستخدم <span class="table-code">changed_by_name</span>: <b><?php echo h($row['changed_by_name'] ?: 'غير معروف'); ?></b><br>
                            IP <span class="table-code">changed_ip</span>: <?php echo h($row['changed_ip'] ?: 'غير معروف'); ?>
                        </div>
                    </div>
                    <div class="diff-wrap">
                        <div class="diff-list">
                            <?php if (!$changes): ?>
                                <div class="empty">لم تظهر فروقات في البيانات المحفوظة.</div>
                            <?php endif; ?>
                            <?php foreach ($changes as $change): ?>
                                <section class="diff-item">
                                    <div class="diff-field"><?php echo audit_field_label_html($change['field']); ?></div>
                                    <div class="diff-values">
                                        <div class="value-box before">
                                            <span class="value-title">قبل <span class="table-code">old_data</span></span>
                                            <div class="value"><?php echo audit_value_html($change['before'], $change['field']); ?></div>
                                        </div>
                                        <div class="value-box after">
                                            <span class="value-title">بعد <span class="table-code">new_data</span></span>
                                            <div class="value"><?php echo audit_value_html($change['after'], $change['field']); ?></div>
                                        </div>
                                    </div>
                                </section>
                            <?php endforeach; ?>
                        </div>
                    </div>
                </article>
            <?php endforeach; ?>
        </section>
    <?php endif; ?>
</main>
</body>
</html>
<?php

function audit_report_user_can_view(PDO $db): bool
{
    $stmt = $db->prepare(
        'SELECT user_id
         FROM privileges
         WHERE user_id = ?
           AND element_id IN (20, 30, 36)
           AND yes_no = 1
         LIMIT 1'
    );
    $stmt->execute(array($_SESSION['user_id']));

    return (bool) $stmt->fetchColumn();
}

function audit_history_table_exists(PDO $db): bool
{
    $stmt = $db->query("SHOW TABLES LIKE 'data_history'");
    return (bool) $stmt->fetchColumn();
}

function audit_distinct_tables(PDO $db): array
{
    $stmt = $db->query("SELECT DISTINCT table_name FROM data_history WHERE table_name NOT IN ('actions', 'log', 'contractsback') ORDER BY table_name");
    return $stmt->fetchAll(PDO::FETCH_COLUMN);
}

function audit_distinct_users(PDO $db): array
{
    $stmt = $db->query(
        'SELECT changed_by_user_id, MAX(changed_by_name) AS changed_by_name
         FROM data_history
         GROUP BY changed_by_user_id
         ORDER BY changed_by_name'
    );

    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

function audit_filter_sql(array $filters): array
{
    $where = array("table_name NOT IN ('actions', 'log', 'contractsback')");
    $params = array();

    if ($filters['table'] !== '') {
        $where[] = 'table_name = ?';
        $params[] = $filters['table'];
    }

    if ($filters['action'] !== '') {
        $where[] = 'action_type = ?';
        $params[] = $filters['action'];
    }

    if ($filters['user'] !== '') {
        $where[] = 'changed_by_user_id = ?';
        $params[] = $filters['user'];
    }

    if ($filters['date_from'] !== '') {
        $where[] = 'changed_at >= ?';
        $params[] = $filters['date_from'] . ' 00:00:00';
    }

    if ($filters['date_to'] !== '') {
        $where[] = 'changed_at <= ?';
        $params[] = $filters['date_to'] . ' 23:59:59';
    }

    return array($where ? 'WHERE ' . implode(' AND ', $where) : '', $params);
}

function audit_summary(PDO $db, string $whereSql, array $params): array
{
    $stmt = $db->prepare(
        "SELECT
            COUNT(*) AS total,
            COUNT(DISTINCT table_name) AS tables_count,
            COUNT(DISTINCT changed_by_user_id) AS users_count
         FROM data_history
         {$whereSql}"
    );
    $stmt->execute($params);

    return $stmt->fetch(PDO::FETCH_ASSOC) ?: array('total' => 0, 'tables_count' => 0, 'users_count' => 0);
}

function audit_table_summary(PDO $db, string $whereSql, array $params): array
{
    $stmt = $db->prepare(
        "SELECT
            table_name,
            SUM(action_type = 'INSERT') AS insert_count,
            SUM(action_type = 'UPDATE') AS update_count,
            SUM(action_type = 'DELETE') AS delete_count,
            COUNT(*) AS total
         FROM data_history
         {$whereSql}
         GROUP BY table_name
         ORDER BY total DESC, table_name
         LIMIT 30"
    );
    $stmt->execute($params);

    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

function audit_history_rows(PDO $db, string $whereSql, array $params): array
{
    $stmt = $db->prepare(
        "SELECT history_id, table_name, record_pk, action_type, old_data, new_data,
                changed_by_user_id, changed_by_name, changed_ip, changed_url, changed_at
         FROM data_history
         {$whereSql}
         ORDER BY changed_at DESC, history_id DESC
         LIMIT 200"
    );
    $stmt->execute($params);

    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

function audit_decode_json($json): array
{
    if (!is_string($json) || trim($json) === '') {
        return array();
    }

    $decoded = json_decode($json, true);
    return is_array($decoded) ? $decoded : array();
}

function audit_changes(array $oldData, array $newData, string $action): array
{
    $keys = array_unique(array_merge(array_keys($oldData), array_keys($newData)));
    sort($keys);

    $changes = array();
    foreach ($keys as $key) {
        $before = array_key_exists($key, $oldData) ? $oldData[$key] : null;
        $after = array_key_exists($key, $newData) ? $newData[$key] : null;

        if ($action === 'UPDATE' && audit_compare_value($before) === audit_compare_value($after)) {
            continue;
        }

        $changes[] = array(
            'field' => $key,
            'before' => $action === 'INSERT' ? null : $before,
            'after' => $action === 'DELETE' ? null : $after,
        );
    }

    return $changes;
}

function audit_compare_value($value): string
{
    return json_encode($value, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}

function audit_value_html($value, string $field = ''): string
{
    if ($value === null || $value === '') {
        return '<span class="empty">فارغ</span>';
    }

    if (is_bool($value)) {
        return $value ? 'نعم' : 'لا';
    }

    if (is_array($value)) {
        $value = json_encode($value, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    }

    $value = (string) $value;
    if (audit_field_is_date($field)) {
        $value = audit_date_ymd($value);
    }

    return h($value);
}

function audit_field_is_date(string $field): bool
{
    $field = strtolower($field);
    return $field === 'date'
        || $field === 'start'
        || $field === 'end'
        || strpos($field, 'date') !== false
        || substr($field, -3) === '_at';
}

function audit_date_ymd($value): string
{
    $value = trim((string) $value);
    if ($value === '') {
        return '';
    }

    try {
        return (new DateTime($value))->format('Y-m-d');
    } catch (Throwable $e) {
        return $value;
    }
}

function audit_time_hm($value): string
{
    $value = trim((string) $value);
    if ($value === '') {
        return '';
    }

    try {
        return (new DateTime($value))->format('H:i');
    } catch (Throwable $e) {
        return '';
    }
}

function audit_table_label(string $table): string
{
    return audit_table_arabic($table) . ' (' . $table . ')';
}

function audit_table_label_html(string $table): string
{
    return '<span class="label-ar">' . h(audit_table_arabic($table)) . '</span><span class="label-en">' . h($table) . '</span>';
}

function audit_table_arabic(string $table): string
{
    $labels = array(
        'aksat_contract' => 'عقود الأقساط',
        'aksat_payed' => 'سداد الأقساط',
        'branches' => 'الفروع',
        'cars' => 'السيارات',
        'contracts' => 'العقود',
        'courts_in' => 'تحصيل المحكمة',
        'customers' => 'المستأجرون',
        'data_history' => 'سجل التعديلات',
        'debit_vat' => 'إشعارات الخصم',
        'deduction' => 'الخصومات',
        'invoice' => 'سندات القبض',
        'material_in' => 'إدخال المواد',
        'material_supp' => 'مواد الموردين',
        'naql' => 'النقل',
        'outvoice' => 'سندات الصرف',
        'privileges' => 'الصلاحيات',
        'supplycomp' => 'الموردون',
        'users' => 'المستخدمون',
        'vat' => 'فواتير الضريبة',
    );

    return $labels[$table] ?? audit_human_label($table);
}

function audit_field_label_html(string $field): string
{
    return '<span class="field-ar">' . h(audit_field_arabic($field)) . '</span><span class="field-en">' . h($field) . '</span>';
}

function audit_field_label(string $field): string
{
    return audit_field_arabic($field) . ' (' . $field . ')';
}

function audit_field_arabic(string $field): string
{
    $labels = array(
        'active' => 'الحالة',
        'addtion_cost' => 'تعويضات',
        'addtion_desc' => 'بيان التعويضات',
        'address' => 'العنوان',
        'after_vat' => 'الإجمالي بعد الضريبة',
        'amount' => 'المبلغ',
        'audate' => 'وقت التسجيل',
        'b_name' => 'اسم الفرع',
        'branch' => 'الفرع',
        'branch_id' => 'رقم الفرع',
        'branchID' => 'رقم الفرع',
        'car_id' => 'رقم السيارة',
        'carid' => 'رقم السيارة',
        'color' => 'اللون',
        'comm' => 'ملاحظات',
        'contract_code' => 'رقم العقد',
        'contract_id' => 'رقم العقد',
        'cont_status' => 'حالة العقد',
        'cost' => 'التكلفة',
        'cust_id' => 'رقم المستأجر',
        'cust_id2' => 'رقم المستأجر الإضافي',
        'cust_name' => 'اسم المستأجر',
        'customer_id' => 'رقم المستأجر',
        'date_in' => 'تاريخ الدخول',
        'date_out' => 'تاريخ الخروج',
        'day_cost' => 'سعر اليوم',
        'days_cost' => 'إجمالي الأيام',
        'days_qty' => 'عدد الأيام',
        'deduction' => 'الخصم',
        'dept_comm' => 'تعليمات الإدارة',
        'end' => 'تاريخ النهاية',
        'end_date' => 'تاريخ النهاية',
        'father' => 'المستخدم',
        'free_kilo' => 'الكيلو المسموح',
        'history_id' => 'رقم الحركة',
        'hour_cost' => 'سعر الساعة',
        'hour_qty' => 'عدد الساعات',
        'hours_cost' => 'إجمالي الساعات',
        'idSA' => 'رقم الهوية',
        'ins_claim' => 'مطالبة تأمين',
        'kilo_cost' => 'سعر الكيلو',
        'kilos_cost' => 'إجمالي الكيلوات',
        'kind' => 'نوع السيارة',
        'km_in' => 'كيلو الدخول',
        'km_out' => 'كيلو الخروج',
        'license' => 'الرخصة',
        'lic_expire' => 'انتهاء الرخصة',
        'model' => 'الموديل',
        'money_de' => 'مبلغ الخصم',
        'money_in' => 'مبلغ القبض',
        'money_out' => 'مبلغ الصرف',
        'name' => 'الاسم',
        'net_cost' => 'صافي الإيجار',
        'numbers' => 'رقم اللوحة',
        'open_comm' => 'ملاحظات فتح العقد',
        'open_kilo' => 'كيلو مفتوح',
        'operating_comm' => 'تعليمات التشغيل',
        'payed' => 'المدفوع',
        'payMethod' => 'طريقة الدفع',
        'payOutMethod' => 'طريقة الصرف',
        'phone' => 'الجوال',
        'phone1' => 'الجوال',
        'phone2' => 'جوال إضافي',
        'realName' => 'اسم المستخدم',
        'record_pk' => 'مفتاح السجل',
        'rent_days' => 'أيام الإيجار',
        'sanad_date' => 'تاريخ سند القبض',
        'sanad_out' => 'تاريخ سند الصرف',
        'start' => 'تاريخ البداية',
        'start_date' => 'تاريخ البداية',
        'tamm' => 'تم',
        'time_in' => 'وقت الدخول',
        'time_out' => 'وقت الخروج',
        'total' => 'الإجمالي',
        'total_cost' => 'إجمالي التكلفة',
        'used_area' => 'منطقة الاستخدام',
        'user_id' => 'رقم المستخدم',
        'vat15' => 'ضريبة 15%',
        'vat5' => 'ضريبة 5%',
        'vat_req' => 'الضريبة المطلوبة',
        'violations' => 'المخالفات',
        'wanted' => 'المطلوب',
        'wesam_ins' => 'تأمين ذهبي',
    );

    return $labels[$field] ?? audit_human_label($field);
}

function audit_human_label(string $name): string
{
    $normalized = trim(str_replace('_', ' ', $name));
    if ($normalized === '') {
        return 'حقل';
    }

    return 'حقل ' . $normalized;
}

function h(string $value): string
{
    return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
