<?php
declare(strict_types=1);

$root = dirname(__DIR__);
$configFile = $root . '/config/config.php';
if (is_file($configFile)) {
    header('Location: ../login.php');
    exit;
}

$secure = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off');
$basePath = rtrim(str_replace('/install', '', dirname((string)($_SERVER['SCRIPT_NAME'] ?? ''))), '/');
$detectedUrl = ($secure ? 'https' : 'http') . '://' . ($_SERVER['HTTP_HOST'] ?? 'localhost') . $basePath;
$error = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $data = [
        'app_url' => rtrim(trim((string)($_POST['app_url'] ?? '')), '/'),
        'db_host' => trim((string)($_POST['db_host'] ?? 'localhost')),
        'db_port' => trim((string)($_POST['db_port'] ?? '3306')),
        'db_name' => trim((string)($_POST['db_name'] ?? '')),
        'db_user' => trim((string)($_POST['db_user'] ?? '')),
        'db_pass' => (string)($_POST['db_pass'] ?? ''),
    ];
    $companyName = trim((string)($_POST['company_name'] ?? ''));
    $branchName = trim((string)($_POST['branch_name'] ?? 'الفرع الرئيسي'));
    $city = trim((string)($_POST['city'] ?? 'الرياض'));
    $adminName = trim((string)($_POST['admin_name'] ?? ''));
    $adminEmail = strtolower(trim((string)($_POST['admin_email'] ?? '')));
    $adminPassword = (string)($_POST['admin_password'] ?? '');
    $fiscalYear = (int)($_POST['fiscal_year'] ?? date('Y'));

    try {
        if ($data['db_name'] === '' || $data['db_user'] === '' || $companyName === '' || $adminName === '') {
            throw new RuntimeException('أكمل جميع الحقول المطلوبة.');
        }
        if (!filter_var($adminEmail, FILTER_VALIDATE_EMAIL)) {
            throw new RuntimeException('البريد الإلكتروني غير صحيح.');
        }
        if (strlen($adminPassword) < 8) {
            throw new RuntimeException('كلمة مرور المدير يجب ألا تقل عن 8 أحرف.');
        }

        $dsn = sprintf('mysql:host=%s;port=%s;dbname=%s;charset=utf8mb4', $data['db_host'], $data['db_port'], $data['db_name']);
        $pdo = new PDO($dsn, $data['db_user'], $data['db_pass'], [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES => false,
        ]);
        $schemaCheck = $pdo->query("SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='companies' AND COLUMN_NAME='legal_name_ar'");
        if ((int)$schemaCheck->fetchColumn() !== 1) {
            throw new RuntimeException('هيكل قاعدة البيانات غير متوافق. استورد ملف matchsys_finan.sql المرفق أولًا ثم أعد المحاولة.');
        }

        if ((int)$pdo->query('SELECT COUNT(*) FROM companies WHERE deleted_at IS NULL')->fetchColumn() > 0) {
            throw new RuntimeException('قاعدة البيانات تحتوي شركة مسبقًا. استخدم قاعدة فارغة أو احذف ملف الإعداد القديم فقط إذا كنت تعيد التثبيت عن قصد.');
        }

        $pdo->beginTransaction();
        $now = date('Y-m-d H:i:s');
        $currencyId = (int)$pdo->query("SELECT id FROM currencies WHERE code='SAR' LIMIT 1")->fetchColumn();
        if ($currencyId < 1) { throw new RuntimeException('لم يتم العثور على عملة SAR في جدول العملات. أعد استيراد ملف قاعدة البيانات كاملًا.'); }
        $stmt = $pdo->prepare('INSERT INTO companies (legal_name_ar,commercial_registration_no,vat_registration_no,city,country_code,base_currency_id,fiscal_year_start_month,timezone,status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,\'active\',NOW(),NOW())');
        $stmt->execute([$companyName, trim((string)($_POST['commercial_registration'] ?? '')) ?: null, trim((string)($_POST['tax_number'] ?? '')) ?: null, $city, 'SA', $currencyId, 1, 'Asia/Riyadh']);
        $companyId = (int)$pdo->lastInsertId();

        $stmt = $pdo->prepare('INSERT INTO branches (company_id,code,name_ar,city,is_head_office,is_active,created_at,updated_at) VALUES (?,?,?,?,1,1,NOW(),NOW())');
        $stmt->execute([$companyId, 'MAIN', $branchName, $city]);
        $branchId = (int)$pdo->lastInsertId();

        $stmt = $pdo->prepare('INSERT INTO roles (company_id,code,name_ar,description,is_system,is_active,created_at,updated_at) VALUES (?,?,?,?,1,1,NOW(),NOW())');
        $stmt->execute([$companyId, 'SYSTEM_ADMIN', 'مدير النظام', 'كامل صلاحيات الإدارة والإعداد']);
        $adminRoleId = (int)$pdo->lastInsertId();
        $stmt->execute([$companyId, 'FINANCE_MANAGER', 'المدير المالي', 'إدارة المحاسبة والخزينة والتقارير']);

        $pdo->prepare('INSERT INTO role_permissions (role_id,permission_id,created_at) SELECT ?,id,NOW() FROM permissions')->execute([$adminRoleId]);

        $stmt = $pdo->prepare('INSERT INTO users (company_id,branch_id,full_name,email,password_hash,must_change_password,status,created_at,updated_at) VALUES (?,?,?,?,?,0,\'active\',NOW(),NOW())');
        $stmt->execute([$companyId, $branchId, $adminName, $adminEmail, password_hash($adminPassword, PASSWORD_DEFAULT)]);
        $adminId = (int)$pdo->lastInsertId();
        $pdo->prepare('INSERT INTO user_roles (user_id,role_id,branch_id,project_scope,created_at) VALUES (?,?,?,\'all\',NOW())')->execute([$adminId, $adminRoleId, $branchId]);

        $startDate = sprintf('%04d-01-01', $fiscalYear);
        $endDate = sprintf('%04d-12-31', $fiscalYear);
        $stmt = $pdo->prepare('INSERT INTO fiscal_years (company_id,code,name,starts_on,ends_on,status,created_at,updated_at) VALUES (?,?,?,?,?,\'open\',NOW(),NOW())');
        $stmt->execute([$companyId, (string)$fiscalYear, 'السنة المالية ' . $fiscalYear, $startDate, $endDate]);
        $fiscalYearId = (int)$pdo->lastInsertId();
        $months = ['يناير','فبراير','مارس','أبريل','مايو','يونيو','يوليو','أغسطس','سبتمبر','أكتوبر','نوفمبر','ديسمبر'];
        $stmt = $pdo->prepare('INSERT INTO fiscal_periods (fiscal_year_id,period_no,name,starts_on,ends_on,status) VALUES (?,?,?,?,?,?)');
        foreach ($months as $index => $month) {
            $monthNo = $index + 1;
            $monthStart = sprintf('%04d-%02d-01', $fiscalYear, $monthNo);
            $monthEnd = date('Y-m-t', strtotime($monthStart));
            $stmt->execute([$fiscalYearId, $monthNo, $month, $monthStart, $monthEnd, 'open']);
        }

        $typeIds = $pdo->query('SELECT code,id FROM account_types')->fetchAll(PDO::FETCH_KEY_PAIR);
        $accounts = [['1000','الأصول','ASSET',0,0,0,0],['1100','النقدية والبنوك','ASSET',0,0,0,0],['1110','الصندوق الرئيسي','ASSET',1,0,0,0],['1120','البنك — حساب جاري','ASSET',1,0,0,0],['1200','حساب مراقبة العملاء','ASSET',1,0,0,1],['2000','الالتزامات','LIABILITY',0,0,0,0],['2100','حساب مراقبة الموردين','LIABILITY',1,0,0,1],['3000','حقوق الملكية','EQUITY',0,0,0,0],['4000','إيرادات أعمال المقاولات','REVENUE',1,1,0,0],['5000','تكاليف المشاريع','COST_OF_REVENUE',0,0,0,0],['5100','تكلفة مواد المشاريع','COST_OF_REVENUE',1,1,1,0],['5200','تكلفة مقاولي الباطن','COST_OF_REVENUE',1,1,1,1]];
        $stmt = $pdo->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 (?,?,?,?,?,?,?,?,\'active\',NOW(),NOW())');
        foreach ($accounts as $account) { $typeId = (int)($typeIds[$account[2]] ?? 0); if (!$typeId) { throw new RuntimeException('بيانات أنواع الحسابات ناقصة.'); } $stmt->execute([$companyId,$typeId,$account[0],$account[1],$account[3],$account[4],$account[5],$account[6]]); }

        $stmt = $pdo->prepare('INSERT INTO system_settings (company_id,setting_group,setting_key,value_type,setting_value,updated_by,updated_at) VALUES (?,?,?,?,?,?,NOW())');
        foreach ([['inventory_method','weighted_average'],['journal_approval','required'],['base_currency','SAR']] as $setting) {
            $stmt->execute([$companyId, 'general', $setting[0], 'string', json_encode($setting[1]), $adminId]);
        }
        $stmt = $pdo->prepare('INSERT INTO audit_logs (company_id,user_id,event_type,object_type,object_id,event_description,new_values,ip_address,user_agent,created_at) VALUES (?,?,?,?,?,?,?,?,?,NOW())');
        $stmt->execute([$companyId, $adminId, 'system.install', 'company', $companyId, 'تثبيت النظام', json_encode(['version' => '3.0.0'], JSON_UNESCAPED_UNICODE), $_SERVER['REMOTE_ADDR'] ?? '', $_SERVER['HTTP_USER_AGENT'] ?? '']);
        $pdo->commit();

        $configContent = "<?php\nreturn " . var_export($data, true) . ";\n";
        if (file_put_contents($configFile, $configContent, LOCK_EX) === false) {
            throw new RuntimeException('تم إنشاء الجداول لكن تعذر كتابة config/config.php. أعطِ مجلد config صلاحية 755 أو أنشئ الملف يدويًا من config.example.php.');
        }
        @chmod($configFile, 0640);
        header('Location: ../login.php?installed=1');
        exit;
    } catch (Throwable $exception) {
        if (isset($pdo) && $pdo instanceof PDO && $pdo->inTransaction()) {
            $pdo->rollBack();
        }
        $error = $exception->getMessage();
    }
}
?>
<!doctype html>
<html lang="ar" dir="rtl">
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>تثبيت نظام ركائز</title><link rel="stylesheet" href="../assets/style.css"></head>
<body class="install-body">
<main class="install-shell">
  <aside class="install-aside"><div class="logo-box">ر</div><p class="eyebrow">معالج التثبيت</p><h1>نظام ركائز المالي للمقاولات</h1><p>أدخل بيانات قاعدة cPanel والشركة، وسيتم إنشاء النظام وحساب المدير تلقائيًا.</p><ul><li>PHP وMySQL فقط</li><li>بدون Composer</li><li>واجهة عربية متجاوبة</li><li>حماية جلسات وCSRF</li></ul></aside>
  <section class="install-card">
    <header><span>الإصدار 3.0.0</span><h2>إعداد قاعدة البيانات والشركة</h2><p>استورد ملف قاعدة النظام أولًا، ثم أدخل بيانات اتصال cPanel هنا.</p></header>
    <?php if ($error): ?><div class="alert error"><?= htmlspecialchars($error, ENT_QUOTES, 'UTF-8') ?></div><?php endif; ?>
    <form method="post" autocomplete="off">
      <h3>بيانات الاتصال</h3><div class="form-grid">
        <label class="wide">رابط النظام<input name="app_url" value="<?= htmlspecialchars($_POST['app_url'] ?? $detectedUrl, ENT_QUOTES, 'UTF-8') ?>" required></label>
        <label>خادم MySQL<input name="db_host" value="<?= htmlspecialchars($_POST['db_host'] ?? 'localhost', ENT_QUOTES, 'UTF-8') ?>" required></label>
        <label>المنفذ<input name="db_port" value="<?= htmlspecialchars($_POST['db_port'] ?? '3306', ENT_QUOTES, 'UTF-8') ?>" required></label>
        <label>اسم قاعدة البيانات<input name="db_name" value="<?= htmlspecialchars($_POST['db_name'] ?? '', ENT_QUOTES, 'UTF-8') ?>" required></label>
        <label>مستخدم قاعدة البيانات<input name="db_user" value="<?= htmlspecialchars($_POST['db_user'] ?? '', ENT_QUOTES, 'UTF-8') ?>" required></label>
        <label class="wide">كلمة مرور قاعدة البيانات<input type="password" name="db_pass"></label>
      </div>
      <h3>بيانات الشركة</h3><div class="form-grid">
        <label class="wide">اسم الشركة<input name="company_name" value="<?= htmlspecialchars($_POST['company_name'] ?? '', ENT_QUOTES, 'UTF-8') ?>" required></label>
        <label>السجل التجاري<input name="commercial_registration" value="<?= htmlspecialchars($_POST['commercial_registration'] ?? '', ENT_QUOTES, 'UTF-8') ?>"></label>
        <label>الرقم الضريبي<input name="tax_number" value="<?= htmlspecialchars($_POST['tax_number'] ?? '', ENT_QUOTES, 'UTF-8') ?>"></label>
        <label>اسم الفرع<input name="branch_name" value="<?= htmlspecialchars($_POST['branch_name'] ?? 'الفرع الرئيسي', ENT_QUOTES, 'UTF-8') ?>" required></label>
        <label>المدينة<input name="city" value="<?= htmlspecialchars($_POST['city'] ?? 'الرياض', ENT_QUOTES, 'UTF-8') ?>"></label>
        <label>السنة المالية<input type="number" min="2020" max="2100" name="fiscal_year" value="<?= htmlspecialchars($_POST['fiscal_year'] ?? date('Y'), ENT_QUOTES, 'UTF-8') ?>"></label>
      </div>
      <h3>حساب مدير النظام</h3><div class="form-grid">
        <label>الاسم الكامل<input name="admin_name" value="<?= htmlspecialchars($_POST['admin_name'] ?? '', ENT_QUOTES, 'UTF-8') ?>" required></label>
        <label>البريد الإلكتروني<input type="email" name="admin_email" value="<?= htmlspecialchars($_POST['admin_email'] ?? '', ENT_QUOTES, 'UTF-8') ?>" required></label>
        <label class="wide">كلمة المرور<input type="password" name="admin_password" minlength="8" required><small>8 أحرف على الأقل.</small></label>
      </div>
      <button class="primary-btn install-submit" type="submit">تثبيت النظام الآن</button>
    </form>
  </section>
</main>
</body></html>
