<?php
// app/seed_chart.php
require_once __DIR__ . '/db.php';

/**
 * ينسخ شجرة الحسابات الافتراضية من الشركة رقم 1 عند إنشاء شركة جديدة.
 * في حالة عدم وجود شجرة افتراضية للشركة 1، يتم استخدام الشجرة المدمجة كبديل.
 */
function seed_default_chart(PDO $pdo, int $companyId): void {
  // avoid reseed
  $c = (int)$pdo->query("SELECT COUNT(*) AS c FROM accounts WHERE company_id=".(int)$companyId)->fetch()['c'];
  if ($c > 0) return;

  $manageTx = !$pdo->inTransaction();
  if ($manageTx) $pdo->beginTransaction();

  try {
    if (clone_chart_from_company($pdo, 1, $companyId)) {
      if ($manageTx) $pdo->commit();
      return;
    }

    seed_builtin_chart($pdo, $companyId);

    if ($manageTx) $pdo->commit();
  } catch (Throwable $e) {
    if ($manageTx && $pdo->inTransaction()) $pdo->rollBack();
    throw $e;
  }
}

/**
 * ينسخ الحسابات من شركة مرجعية إلى شركة جديدة مع إعادة ربط parent_id.
 */
function clone_chart_from_company(PDO $pdo, int $sourceCompanyId, int $targetCompanyId): bool {
  if ($sourceCompanyId <= 0 || $targetCompanyId <= 0 || $sourceCompanyId === $targetCompanyId) {
    return false;
  }

  $st = $pdo->prepare("SELECT * FROM accounts WHERE company_id=? ORDER BY id ASC");
  $st->execute([$sourceCompanyId]);
  $rows = $st->fetchAll(PDO::FETCH_ASSOC);

  if (!$rows) return false;

  $hasRequiredColumns = [
    'code','name','type','normal_side','parent_id','is_cash','is_locked'
  ];

  foreach ($hasRequiredColumns as $col) {
    if (!array_key_exists($col, $rows[0])) return false;
  }

  $map = [];
  $inserted = 0;

  $ins = $pdo->prepare(
    "INSERT INTO accounts
      (company_id, code, name, type, normal_side, parent_id, is_cash, is_locked, is_active)
     VALUES (?,?,?,?,?,?,?,?,?)"
  );

  foreach ($rows as $row) {
    $oldId = (int)$row['id'];
    $oldParentId = $row['parent_id'] !== null ? (int)$row['parent_id'] : null;
    $newParentId = $oldParentId ? ($map[$oldParentId] ?? null) : null;

    $ins->execute([
      $targetCompanyId,
      (string)$row['code'],
      (string)$row['name'],
      (string)$row['type'],
      (string)$row['normal_side'],
      $newParentId,
      (int)($row['is_cash'] ?? 0),
      (int)($row['is_locked'] ?? 0),
      isset($row['is_active']) ? (int)$row['is_active'] : 1,
    ]);

    $map[$oldId] = (int)$pdo->lastInsertId();
    $inserted++;
  }

  return $inserted > 0;
}

/**
 * شجرة افتراضية احتياطية تُستخدم فقط لو لم تكن الشركة 1 تحتوي على شجرة حسابات.
 */
function seed_builtin_chart(PDO $pdo, int $companyId): void {
  $ins = $pdo->prepare("INSERT INTO accounts (company_id, code, name, type, normal_side, parent_id, is_cash, is_locked) VALUES (?,?,?,?,?,?,?,1)");

  $ins->execute([$companyId,'1000','الأصول','ASSET','DEBIT',null,0]); $A_ASSETS = (int)$pdo->lastInsertId();
  $ins->execute([$companyId,'1100','النقدية والبنوك','ASSET','DEBIT',$A_ASSETS,0]); $A_CASH = (int)$pdo->lastInsertId();
  $ins->execute([$companyId,'1200','ذمم مدينة (عملاء)','ASSET','DEBIT',$A_ASSETS,0]);
  $ins->execute([$companyId,'1300','الأصول الثابتة','ASSET','DEBIT',$A_ASSETS,0]); $A_FA = (int)$pdo->lastInsertId();

  $ins->execute([$companyId,'1110','الصندوق','ASSET','DEBIT',$A_CASH,1]);
  $ins->execute([$companyId,'1120','بنك - جاري','ASSET','DEBIT',$A_CASH,1]);

  $ins->execute([$companyId,'1310','أثاث وتجهيزات','ASSET','DEBIT',$A_FA,0]);
  $ins->execute([$companyId,'1320','سيارات (أصول)','ASSET','DEBIT',$A_FA,0]);
  // مجمع إهلاك: كأصل طبيعيته Credit
  $pdo->prepare("INSERT INTO accounts (company_id, code, name, type, normal_side, parent_id, is_cash, is_locked) VALUES (?,?,?,?,?,?,?,1)")
      ->execute([$companyId,'1390','مجمع إهلاك','ASSET','CREDIT',$A_FA,0]);

  $ins->execute([$companyId,'2000','الخصوم','LIABILITY','CREDIT',null,0]); $A_L = (int)$pdo->lastInsertId();
  $ins->execute([$companyId,'2100','ذمم دائنة (موردين)','LIABILITY','CREDIT',$A_L,0]);
  $ins->execute([$companyId,'2200','مصروفات مستحقة','LIABILITY','CREDIT',$A_L,0]);

  $ins->execute([$companyId,'3000','حقوق الملكية','EQUITY','CREDIT',null,0]); $A_E = (int)$pdo->lastInsertId();
  $ins->execute([$companyId,'3100','رأس المال','EQUITY','CREDIT',$A_E,0]);
  $ins->execute([$companyId,'3200','الأرباح المحتجزة','EQUITY','CREDIT',$A_E,0]);

  $ins->execute([$companyId,'4000','الإيرادات','REVENUE','CREDIT',null,0]); $A_R = (int)$pdo->lastInsertId();
  $ins->execute([$companyId,'4100','إيرادات تأجير فنادق/شقق فندقية','REVENUE','CREDIT',$A_R,0]);
  $ins->execute([$companyId,'4200','إيرادات تأجير سيارات','REVENUE','CREDIT',$A_R,0]);
  $ins->execute([$companyId,'4300','إيرادات خدمات سياحية أخرى','REVENUE','CREDIT',$A_R,0]);

  $ins->execute([$companyId,'5000','المصروفات','EXPENSE','DEBIT',null,0]); $A_X = (int)$pdo->lastInsertId();
  $ins->execute([$companyId,'5100','مصروفات تشغيل الفنادق/الشقق','EXPENSE','DEBIT',$A_X,0]);
  $ins->execute([$companyId,'5200','مصروفات تشغيل السيارات (وقود/صيانة)','EXPENSE','DEBIT',$A_X,0]);
  $ins->execute([$companyId,'5300','مصروفات منزلية يومية','EXPENSE','DEBIT',$A_X,0]);
  $ins->execute([$companyId,'5310','بقالة/طعام','EXPENSE','DEBIT',$A_X,0]);
  $ins->execute([$companyId,'5320','مواصلات','EXPENSE','DEBIT',$A_X,0]);
  $ins->execute([$companyId,'5330','كهرباء/مياه/غاز','EXPENSE','DEBIT',$A_X,0]);
  $ins->execute([$companyId,'5340','إنترنت/اتصالات','EXPENSE','DEBIT',$A_X,0]);
  $ins->execute([$companyId,'5400','رواتب وأجور','EXPENSE','DEBIT',$A_X,0]);
  $ins->execute([$companyId,'5500','إهلاك','EXPENSE','DEBIT',$A_X,0]);
}
