<?php
declare(strict_types=1);
require __DIR__ . '/app/bootstrap.php';
require_auth();
require __DIR__ . '/app/layout.php';

$allowedPages = ['dashboard','settings','company','users','periods','accounts'];
$page = (string)($_GET['page'] ?? 'dashboard');
if (!in_array($page, $allowedPages, true)) {
    $page = 'dashboard';
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    verify_csrf();
    $action = (string)($_POST['action'] ?? '');
    try {
        if ($action === 'company_save') {
            $currencyId = (int)scalar('SELECT id FROM currencies WHERE code=?', [(string)$_POST['base_currency']]);
            $stmt = db()->prepare('UPDATE companies SET legal_name_ar=?,commercial_registration_no=?,vat_registration_no=?,base_currency_id=?,updated_at=NOW() WHERE id=?');
            $stmt->execute([trim((string)$_POST['legal_name']), trim((string)$_POST['commercial_registration']) ?: null, trim((string)$_POST['tax_number']) ?: null, $currencyId, company_id()]);
            $stmt = db()->prepare('UPDATE branches SET name_ar=?,city=? WHERE id=? AND company_id=?');
            $stmt->execute([trim((string)$_POST['branch_name']), trim((string)$_POST['city']), (int)$_POST['branch_id'], company_id()]);
            $_SESSION['user']['company_name'] = trim((string)$_POST['legal_name']);
            $_SESSION['user']['branch_name'] = trim((string)$_POST['branch_name']);
            audit('company.update', 'company', (string)company_id());
            flash('success', 'تم حفظ بيانات الشركة والفرع.');
            redirect('index.php?page=company');
        }
        if ($action === 'user_add') {
            $name = trim((string)($_POST['full_name'] ?? ''));
            $email = strtolower(trim((string)($_POST['email'] ?? '')));
            $password = (string)($_POST['password'] ?? '');
            if ($name === '' || !filter_var($email, FILTER_VALIDATE_EMAIL) || strlen($password) < 8) {
                throw new RuntimeException('تحقق من الاسم والبريد وكلمة المرور (8 أحرف على الأقل).');
            }
            $stmt = db()->prepare('INSERT INTO users (company_id,branch_id,full_name,email,password_hash,must_change_password,status,created_at,updated_at) VALUES (?,?,?,?,?,1,\'active\',NOW(),NOW())');
            $stmt->execute([company_id(), (int)$_POST['branch_id'], $name, $email, password_hash($password, PASSWORD_DEFAULT)]);
            $newUserId = (int)db()->lastInsertId();
            db()->prepare('INSERT INTO user_roles (user_id,role_id,branch_id,project_scope,created_at) VALUES (?,?,?,\'assigned\',NOW())')->execute([$newUserId,(int)$_POST['role_id'],(int)$_POST['branch_id']]);
            audit('user.create', 'user', (string)$newUserId, ['email' => $email]);
            flash('success', 'تمت إضافة المستخدم بنجاح.');
            redirect('index.php?page=users');
        }
        if ($action === 'period_toggle') {
            $periodId = (int)($_POST['period_id'] ?? 0);
            $stmt = db()->prepare('UPDATE fiscal_periods fp JOIN fiscal_years fy ON fy.id=fp.fiscal_year_id SET fp.status=IF(fp.status=\'open\',\'closed\',\'open\') WHERE fp.id=? AND fy.company_id=?');
            $stmt->execute([$periodId, company_id()]);
            audit('period.toggle', 'fiscal_period', (string)$periodId);
            flash('success', 'تم تحديث حالة الفترة المالية.');
            redirect('index.php?page=periods');
        }
        if ($action === 'account_add') {
            $code = trim((string)($_POST['code'] ?? ''));
            $name = trim((string)($_POST['name_ar'] ?? ''));
            if ($code === '' || $name === '') {
                throw new RuntimeException('رقم الحساب واسمه مطلوبان.');
            }
            $type = strtoupper((string)($_POST['account_type'] ?? 'EXPENSE'));
            $typeId = (int)scalar('SELECT id FROM account_types WHERE code=?', [$type]);
            $stmt = db()->prepare('INSERT INTO accounts (company_id,account_type_id,code,name_ar,is_postable,requires_project,requires_cost_code,requires_partner,status,created_at,updated_at) VALUES (?,?,?,?,1,?,?,?,\'active\',NOW(),NOW())');
            $stmt->execute([company_id(), $typeId, $code, $name, isset($_POST['requires_project']) ? 1 : 0, isset($_POST['requires_cost_code']) ? 1 : 0, isset($_POST['requires_partner']) ? 1 : 0]);
            audit('account.create', 'account', (string)db()->lastInsertId(), ['code' => $code]);
            flash('success', 'تمت إضافة الحساب إلى شجرة الحسابات.');
            redirect('index.php?page=accounts');
        }
    } catch (PDOException $exception) {
        flash('error', $exception->getCode() === '23000' ? 'البيانات مكررة أو مرتبطة بسجل موجود.' : 'تعذر حفظ البيانات في قاعدة البيانات.');
        redirect('index.php?page=' . $page);
    } catch (Throwable $exception) {
        flash('error', $exception->getMessage());
        redirect('index.php?page=' . $page);
    }
}

if ($page === 'dashboard') {
    $userCount = (int)scalar('SELECT COUNT(*) FROM users WHERE company_id=?', [company_id()]);
    $accountCount = (int)scalar('SELECT COUNT(*) FROM accounts WHERE company_id=?', [company_id()]);
    $openPeriods = (int)scalar('SELECT COUNT(*) FROM fiscal_periods fp JOIN fiscal_years fy ON fy.id=fp.fiscal_year_id WHERE fy.company_id=? AND fp.status=\'open\'', [company_id()]);
    render_header('dashboard', 'نظرة مالية شاملة', 'متابعة فورية لأداء المشاريع والسيولة والاعتمادات.'); ?>
    <section class="metrics"><article><i class="tone-teal">◉</i><div><span>الإيرادات</span><strong>18.4 <small>مليون ر.س</small></strong><em>↑ 8.4% عن الفترة السابقة</em></div></article><article><i class="tone-amber">▤</i><div><span>تكلفة المشاريع</span><strong>12.7 <small>مليون ر.س</small></strong><em>↑ 5.2% عن الفترة السابقة</em></div></article><article><i class="tone-green">↗</i><div><span>صافي الربح</span><strong>3.1 <small>مليون ر.س</small></strong><em>↑ 11.6% عن الفترة السابقة</em></div></article><article><i class="tone-blue">▣</i><div><span>رصيد السيولة</span><strong>5.8 <small>مليون ر.س</small></strong><em>↑ 2.1% عن الفترة السابقة</em></div></article></section>
    <section class="dashboard-grid"><article class="panel chart-panel"><header><div><h2>التدفق النقدي</h2><p>المقبوضات والمدفوعات خلال آخر 6 أشهر</p></div><button>آخر 6 أشهر</button></header><div class="line-chart"><span style="height:36%"></span><span style="height:55%"></span><span style="height:48%"></span><span style="height:68%"></span><span style="height:58%"></span><span style="height:84%"></span></div><div class="month-labels"><span>ديسمبر</span><span>يناير</span><span>فبراير</span><span>مارس</span><span>أبريل</span><span>مايو</span></div></article><article class="panel profit-panel"><header><div><h2>ربحية المشاريع</h2><p>هامش الربح للمشاريع النشطة</p></div></header><?php foreach ([['مجمع النخيل',18.7],['برج الياسمين',15.2],['مدرسة الواحة',11.3],['مستودعات الرياض',7.6],['طريق الشرق',4.1],['منتجع البحر الأحمر',-2.3]] as [$name,$value]): ?><div class="profit-row"><span><?= e($name) ?></span><i><b style="width:<?= max(abs($value)*4, 8) ?>%" class="<?= $value < 0 ? 'danger' : ($value < 6 ? 'warning' : '') ?>"></b></i><strong><?= e((string)$value) ?>%</strong></div><?php endforeach; ?></article></section>
    <section class="panel approvals"><header><div><h2>اعتمادات عاجلة</h2><p>3 طلبات تحتاج مراجعتك اليوم</p></div><a href="#">عرض الكل</a></header><div class="responsive-table"><table><thead><tr><th>الموضوع</th><th>الجهة</th><th>المبلغ</th><th>الأولوية</th><th>الحالة</th></tr></thead><tbody><tr><td>دفعة مقاول باطن — مشروع برج الياسمين</td><td>إدارة المشاريع</td><td>1,250,000 ر.س</td><td><span class="chip danger">عالية</span></td><td><span class="chip warning">بانتظار اعتمادك</span></td></tr><tr><td>شراء مواد كهربائية — مدرسة الواحة</td><td>المشتريات</td><td>685,000 ر.س</td><td><span class="chip warning">متوسطة</span></td><td><span class="chip warning">بانتظار اعتمادك</span></td></tr><tr><td>سلفة تشغيلية — مستودعات الرياض</td><td>الخزينة</td><td>350,000 ر.س</td><td><span class="chip">متوسطة</span></td><td><span class="chip">قيد المراجعة</span></td></tr></tbody></table></div></section>
    <section class="system-mini"><span><?= $userCount ?> مستخدمين</span><span><?= $accountCount ?> حسابًا</span><span><?= $openPeriods ?> فترات مفتوحة</span></section>
    <?php render_footer(); exit;
}

if ($page === 'settings') {
    render_header('settings', 'إعدادات النظام', 'مركز التحكم في بيانات الشركة والسياسات والمستخدمين.');
    $cards = [['company','بيانات الشركة والفروع','الكيان القانوني والرقم الضريبي والعملات.','▣'],['users','المستخدمون والصلاحيات','الحسابات والأدوار وحدود الاعتماد.','♙'],['periods','السنوات والفترات المالية','فتح وإقفال الفترات المالية.','▦'],['accounts','شجرة الحسابات','الحسابات ومتطلبات المشروع وكود التكلفة.','▤']]; ?>
    <section class="readiness"><div><strong>جاهزية الإعداد الأولي</strong><p>اكتملت البيانات الأساسية، ويمكنك مراجعة السياسات والحسابات.</p></div><b>82%</b></section><section class="settings-grid"><?php foreach ($cards as [$href,$name,$desc,$icon]): ?><a href="<?= e(app_url('index.php?page=' . $href)) ?>"><i><?= e($icon) ?></i><div><h2><?= e($name) ?></h2><p><?= e($desc) ?></p><small>فتح الإعدادات ←</small></div></a><?php endforeach; ?></section>
    <?php render_footer(); exit;
}

if ($page === 'company') {
    $company = db()->prepare('SELECT * FROM companies WHERE id=?'); $company->execute([company_id()]); $company = $company->fetch();
    $branchStmt = db()->prepare('SELECT * FROM branches WHERE company_id=? ORDER BY is_head_office DESC,id LIMIT 1'); $branchStmt->execute([company_id()]); $branch = $branchStmt->fetch();
    render_header('settings', 'بيانات الشركة والفروع', 'البيانات القانونية والضريبية ومعلومات التشغيل.'); ?>
    <form class="panel form-card" method="post"><?= csrf_field() ?><input type="hidden" name="action" value="company_save"><input type="hidden" name="branch_id" value="<?= (int)$branch['id'] ?>"><header><h2>بيانات الكيان القانوني</h2><p>تظهر على الفواتير والمستندات الرسمية.</p></header><div class="form-grid"><label class="wide">الاسم القانوني<input name="legal_name" value="<?= e($company['legal_name_ar']) ?>" required></label><label>السجل التجاري<input name="commercial_registration" value="<?= e($company['commercial_registration_no']) ?>"></label><label>الرقم الضريبي<input name="tax_number" value="<?= e($company['vat_registration_no']) ?>"></label><label>العملة الأساسية<select name="base_currency"><option value="SAR">الريال السعودي</option><option value="USD">الدولار الأمريكي</option></select></label><label>اسم الفرع<input name="branch_name" value="<?= e($branch['name_ar']) ?>" required></label><label>المدينة<input name="city" value="<?= e($branch['city']) ?>"></label></div><footer><button class="primary-btn">حفظ التغييرات</button><a class="secondary-btn" href="<?= e(app_url('index.php?page=settings')) ?>">إلغاء</a></footer></form>
    <?php render_footer(); exit;
}

if ($page === 'users') {
    $stmt = db()->prepare('SELECT u.*,r.name_ar role_name,b.name_ar branch_name FROM users u LEFT JOIN user_roles ur ON ur.user_id=u.id LEFT JOIN roles r ON r.id=ur.role_id LEFT JOIN branches b ON b.id=u.branch_id WHERE u.company_id=? ORDER BY u.id'); $stmt->execute([company_id()]); $users = $stmt->fetchAll();
    $stmt = db()->prepare('SELECT * FROM roles WHERE company_id=? ORDER BY id'); $stmt->execute([company_id()]); $roles = $stmt->fetchAll();
    $stmt = db()->prepare('SELECT * FROM branches WHERE company_id=? AND is_active=1 ORDER BY is_head_office DESC'); $stmt->execute([company_id()]); $branches = $stmt->fetchAll();
    render_header('settings', 'المستخدمون والصلاحيات', 'إدارة حسابات الدخول والأدوار والفروع.'); ?>
    <details class="panel quick-add"><summary>＋ إضافة مستخدم جديد</summary><form method="post"><?= csrf_field() ?><input type="hidden" name="action" value="user_add"><div class="form-grid"><label>الاسم الكامل<input name="full_name" required></label><label>البريد الإلكتروني<input type="email" name="email" required></label><label>كلمة المرور<input type="password" name="password" minlength="8" required></label><label>الدور<select name="role_id"><?php foreach ($roles as $role): ?><option value="<?= (int)$role['id'] ?>"><?= e($role['name_ar']) ?></option><?php endforeach; ?></select></label><label>الفرع<select name="branch_id"><?php foreach ($branches as $branch): ?><option value="<?= (int)$branch['id'] ?>"><?= e($branch['name_ar']) ?></option><?php endforeach; ?></select></label></div><button class="primary-btn">حفظ المستخدم</button></form></details>
    <section class="panel data-card"><div class="responsive-table"><table><thead><tr><th>المستخدم</th><th>الدور</th><th>الفرع</th><th>آخر دخول</th><th>الحالة</th></tr></thead><tbody><?php foreach ($users as $account): ?><tr><td><div class="user-cell"><span><?= e(initial($account['full_name'])) ?></span><div><strong><?= e($account['full_name']) ?></strong><small><?= e($account['email']) ?></small></div></div></td><td><?= e($account['role_name']) ?></td><td><?= e($account['branch_name']) ?></td><td><?= e($account['last_login_at'] ?: 'لم يسجل بعد') ?></td><td><span class="chip <?= $account['status']==='active'?'success':'danger' ?>"><?= $account['status']==='active'?'نشط':'موقوف' ?></span></td></tr><?php endforeach; ?></tbody></table></div></section>
    <?php render_footer(); exit;
}

if ($page === 'periods') {
    $stmt = db()->prepare('SELECT fp.*,fy.name year_name FROM fiscal_periods fp JOIN fiscal_years fy ON fy.id=fp.fiscal_year_id WHERE fy.company_id=? ORDER BY fy.starts_on DESC,fp.period_no'); $stmt->execute([company_id()]); $periods = $stmt->fetchAll();
    render_header('settings', 'السنوات والفترات المالية', 'فتح وإقفال الفترات ومنع الترحيل على الفترات المقفلة.'); ?>
    <section class="period-grid"><?php foreach ($periods as $period): ?><article class="panel period-card <?= e($period['status']) ?>"><header><b><?= str_pad((string)$period['period_no'],2,'0',STR_PAD_LEFT) ?></b><span><?= $period['status']==='open'?'◉':'●' ?></span></header><h2><?= e($period['name']) ?></h2><p><?= e($period['starts_on']) ?> — <?= e($period['ends_on']) ?></p><footer><span class="chip <?= $period['status']==='open'?'success':'' ?>"><?= $period['status']==='open'?'مفتوحة':'مقفلة' ?></span><form method="post"><?= csrf_field() ?><input type="hidden" name="action" value="period_toggle"><input type="hidden" name="period_id" value="<?= (int)$period['id'] ?>"><button><?= $period['status']==='open'?'إقفال الفترة':'إعادة فتح' ?></button></form></footer></article><?php endforeach; ?></section>
    <?php render_footer(); exit;
}

if ($page === 'accounts') {
    $stmt = db()->prepare('SELECT a.*,at.code account_type,at.normal_balance,1 level,a.is_postable is_posting FROM accounts a JOIN account_types at ON at.id=a.account_type_id WHERE a.company_id=? ORDER BY a.code'); $stmt->execute([company_id()]); $accounts = $stmt->fetchAll();
    render_header('accounts', 'شجرة الحسابات', 'هيكلة الحسابات وتحديد متطلبات المشروع وكود التكلفة والطرف.'); ?>
    <details class="panel quick-add"><summary>＋ إضافة حساب حركة</summary><form method="post"><?= csrf_field() ?><input type="hidden" name="action" value="account_add"><div class="form-grid"><label>رقم الحساب<input name="code" required></label><label>اسم الحساب<input name="name_ar" required></label><label>نوع الحساب<select name="account_type"><option value="asset">أصول</option><option value="liability">التزامات</option><option value="equity">حقوق ملكية</option><option value="revenue">إيرادات</option><option value="expense" selected>مصروفات</option></select></label><label class="checks"><span><input type="checkbox" name="requires_project"> يتطلب مشروعًا</span><span><input type="checkbox" name="requires_cost_code"> يتطلب كود تكلفة</span><span><input type="checkbox" name="requires_partner"> يتطلب طرفًا</span></label></div><button class="primary-btn">حفظ الحساب</button></form></details>
    <section class="accounts-layout"><article class="panel account-list"><header><h2>الحسابات</h2><span><?= count($accounts) ?> حسابًا</span></header><?php foreach ($accounts as $account): ?><button type="button" class="account-row" data-account='<?= e(json_encode($account, JSON_UNESCAPED_UNICODE)) ?>'><code><?= e($account['code']) ?></code><span><?= e($account['name_ar']) ?></span><?php if ($account['is_postable']): ?><small>حركة</small><?php endif; ?></button><?php endforeach; ?></article><article class="panel account-detail" id="accountDetail"><p class="muted">اختر حسابًا من الشجرة لعرض خصائصه.</p></article></section>
    <?php render_footer(); exit;
}
