<?php
// المسار: public/checkout.php
// إتمام الشراء (Checkout) متناسق مع الهيدر والفوتر والستايل العام

declare(strict_types=1);

require_once __DIR__ . '/../includes/db.php';
require_once __DIR__ . '/../includes/functions.php'; // تأكد من وجود csrf_token / csrf_check
$config = require __DIR__ . '/../config.php';

$base = rtrim($config['base_url'] ?? '', '/');

if (session_status() !== PHP_SESSION_ACTIVE) {
    session_start();
}

/* =======================
   Helpers
======================= */
if (!function_exists('e')) {
    function e($v){
        return htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8');
    }
}

if (!function_exists('price')) {
    function price(float $v): string {
        global $config;
        $baseCurrency = $config['currency_code'] ?? 'JOD';
        $selected     = $_SESSION['currency'] ?? $baseCurrency;
        $rates        = $config['currency_rates']   ?? [$baseCurrency => 1];
        $symbols      = $config['currency_symbols'] ?? [$baseCurrency => ($config['currency_symbol'] ?? 'د.أ')];

        $rate      = $rates[$selected] ?? 1;
        $converted = $v * $rate;
        $amount    = number_format($converted, 2);
        $symbol    = $symbols[$selected] ?? $selected;
        $pos       = $config['currency_position'] ?? 'after';

        return $pos === 'after' ? "$amount $symbol" : "$symbol $amount";
    }
}

/* =======================
   Cart Items
======================= */
$cart  = $_SESSION['cart'] ?? [];
$items = [];
$total = 0.0;

if ($cart) {
    $ids = array_map('intval', array_keys($cart));
    $ids = array_values(array_unique(array_filter($ids, fn($v) => $v > 0)));

    if ($ids) {
        $in  = implode(',', array_fill(0, count($ids), '?'));
        $sql = "SELECT id, name, price FROM products WHERE id IN ($in)";

        try {
            $st = $pdo->prepare($sql);
            $st->execute($ids);
            $rows = $st->fetchAll(PDO::FETCH_ASSOC);
        } catch (Throwable $e) {
            $rows = [];
        }

        $map = [];
        foreach ($rows as $r) {
            $map[(int)$r['id']] = $r;
        }

        foreach ($cart as $pid => $qty) {
            $pid = (int)$pid;
            $qty = (int)$qty;
            if ($qty <= 0 || !isset($map[$pid])) continue;

            $p     = $map[$pid];
            $price = (float)$p['price'];
            $line  = $price * $qty;
            $total += $line;

            $items[] = [
                'id'       => $pid,
                'name'     => $p['name'],
                'price'    => $price,
                'qty'      => $qty,
                'subtotal' => $line,
            ];
        }
    }
}

/* =======================
   Handle POST (Create Order)
======================= */
$err          = '';
$msg          = '';
$orderCreated = false;
$orderId      = null;

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!csrf_check($_POST['csrf'] ?? '')) {
        $err = 'انتهت صلاحية النموذج. رجاء أعد المحاولة.';
    } elseif (!$items) {
        $err = 'السلة فارغة.';
    } else {
        $name    = trim($_POST['name'] ?? '');
        $phone   = trim($_POST['phone'] ?? '');
        $address = trim($_POST['address'] ?? '');
        $method  = $_POST['payment_method'] ?? 'cod'; // cod | cliq | card

        if ($name === '' || $phone === '' || $address === '') {
            $err = 'يرجى تعبئة جميع الحقول.';
        } elseif (!in_array($method, ['cod','cliq','card'], true)) {
            $err = 'طريقة دفع غير صالحة.';
        } else {

            // الحالة المبدئية
            $gateway       = null;
            $paymentStatus = 'pending';
            $orderStatus   = 'new';

            if ($method === 'cliq') {
                $gateway       = 'cliq';
                $paymentStatus = 'awaiting_transfer';
                $orderStatus   = 'waiting_payment';
            } elseif ($method === 'card') {
                $gateway       = 'card_stub';
                $paymentStatus = 'initiated';
                $orderStatus   = 'waiting_payment';
            } else { // cod
                $gateway       = 'cod';
                $paymentStatus = 'pending';
                $orderStatus   = 'new';
            }

            $paymentMeta = [];

            // بيانات CliQ
            if ($method === 'cliq') {
                $cliqRef  = trim($_POST['cliq_reference'] ?? '');
                $cliqIban = trim($_POST['cliq_iban'] ?? '');

                if ($cliqIban === '') {
                    $err = 'يرجى إدخال رقم IBAN أو حساب الاستقبال.';
                } elseif ($cliqRef === '') {
                    $err = 'يرجى إدخال مرجع التحويل (Reference).';
                } else {
                    $paymentMeta['cliq_reference'] = $cliqRef;
                    $paymentMeta['cliq_iban']      = $cliqIban;
                }
            }

            // بيانات البطاقة (اختبارية)
            if ($method === 'card' && !$err) {
                $cardHolder = trim($_POST['card_holder'] ?? '');
                $cardNumber = preg_replace('/\D+/', '', $_POST['card_number'] ?? '');
                $exp        = trim($_POST['card_exp'] ?? '');
                $cvv        = trim($_POST['card_cvv'] ?? '');

                if ($cardHolder === '' || $cardNumber === '' || $exp === '' || $cvv === '') {
                    $err = 'يرجى تعبئة بيانات البطاقة كاملة.';
                } elseif (strlen($cardNumber) < 12) {
                    $err = 'رقم بطاقة غير صحيح.';
                } else {
                    $paymentMeta['card_last4']  = substr($cardNumber, -4);
                    $paymentMeta['card_holder'] = $cardHolder;
                    $paymentMeta['card_exp']    = $exp;
                    // في الإنتاج يجب إرسال بيانات البطاقة لبوابة دفع آمنة وعدم تخزينها
                }
            }

            if (!$err) {
                try {
                    $pdo->beginTransaction();

                    // عميل (جلب أو إنشاء)
                    $custId = null;
                    $cst = $pdo->prepare('SELECT id FROM customers WHERE phone = :p LIMIT 1');
                    $cst->execute([':p' => $phone]);
                    $rowC = $cst->fetch(PDO::FETCH_ASSOC);

                    if ($rowC) {
                        $custId = (int)$rowC['id'];
                        $upc = $pdo->prepare('UPDATE customers SET name = :n, address = :a WHERE id = :id');
                        $upc->execute([
                            ':n'  => $name,
                            ':a'  => $address,
                            ':id' => $custId
                        ]);
                    } else {
                        $insc = $pdo->prepare(
                            'INSERT INTO customers (name,phone,address,created_at)
                             VALUES (:n,:p,:a,NOW())'
                        );
                        $insc->execute([
                            ':n' => $name,
                            ':p' => $phone,
                            ':a' => $address
                        ]);
                        $custId = (int)$pdo->lastInsertId();
                    }

                    // إنشاء الطلب
                    $insO = $pdo->prepare(
                        'INSERT INTO orders
                         (customer_id,total,payment_method,payment_status,gateway,status,created_at,payment_meta)
                         VALUES
                         (:c,:t,:pm,:ps,:gw,:st,NOW(),:meta)'
                    );
                    $insO->execute([
                        ':c'   => $custId,
                        ':t'   => $total,
                        ':pm'  => $method,
                        ':ps'  => $paymentStatus,
                        ':gw'  => $gateway,
                        ':st'  => $orderStatus,
                        ':meta'=> json_encode($paymentMeta, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES)
                    ]);
                    $orderId = (int)$pdo->lastInsertId();

                    // بنود الطلب + خصم المخزون
                    $insI = $pdo->prepare(
                        'INSERT INTO order_items (order_id,product_id,qty,price)
                         VALUES (:o,:p,:q,:r)'
                    );
                    foreach ($items as $it) {
                        $insI->execute([
                            ':o' => $orderId,
                            ':p' => $it['id'],
                            ':q' => $it['qty'],
                            ':r' => $it['price'],
                        ]);

                        $upStock = $pdo->prepare(
                            'UPDATE products
                             SET stock = GREATEST(0, stock - :q)
                             WHERE id = :id'
                        );
                        $upStock->execute([
                            ':q' => $it['qty'],
                            ':id'=> $it['id'],
                        ]);
                    }

                    $pdo->commit();

                    // تفريغ السلة بعد نجاح إنشاء الطلب
                    $_SESSION['cart']       = [];
                    $_SESSION['cart_count'] = 0;
                    $orderCreated = true;

                    if ($method === 'cod') {
                        $msg = 'تم إنشاء الطلب بنجاح. رقم الطلب: ' . $orderId . ' سيتم الدفع عند التوصيل.';
                    } elseif ($method === 'cliq') {
                        $msg = 'تم إنشاء الطلب رقم ' . $orderId . ' بانتظار التحويل عبر كليك.';
                    } else { // card
                        header('Location: payment_init.php?order=' . $orderId);
                        exit;
                    }

                } catch (Throwable $e) {
                    if ($pdo->inTransaction()) {
                        $pdo->rollBack();
                    }
                    $err = 'تعذر إنشاء الطلب حالياً. حاول لاحقاً.';
                }
            }
        }
    }
}

/* =======================
   View (with shared header/footer)
======================= */
$page_title = 'إتمام الشراء';
include __DIR__ . '/partials/shop_header.php';
?>

<div class="container my-4 checkout-page">

  <!-- شريط علوي -->
  <div class="checkout-hero">
    <div>
      <h1 class="checkout-title">إتمام الشراء</h1>
      <p class="checkout-sub">
        <?= $items ? 'أدخل بيانات التوصيل واختر طريقة الدفع لإكمال طلبك.' : 'السلة فارغة، ابدأ التسوّق لإضافة منتجات.' ?>
      </p>
    </div>
    <div class="checkout-hero-actions">
      <a href="<?= e($base) ?>/public/index.php" class="btn btn-primary btn-sm rounded-pill">
        <i class="bi bi-arrow-right"></i> العودة للرئيسية
      </a>
      <a href="<?= e($base) ?>/public/cart.php" class="btn btn-outline-secondary btn-sm rounded-pill">
        <i class="bi bi-cart"></i> العودة للسلة
      </a>
    </div>
  </div>

  <?php if ($err): ?>
    <div class="alert alert-danger my-3"><?= e($err) ?></div>
  <?php endif; ?>

  <?php if ($msg): ?>
    <div class="alert alert-success my-3"><?= e($msg) ?></div>
  <?php endif; ?>

  <?php if ($orderCreated && $orderId && $_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['payment_method'] ?? '') === 'cod'): ?>
    <div class="card p-3 mt-3 text-center">
      <p class="mb-2">تم إنشاء طلبك بنجاح برقم <strong>#<?= (int)$orderId ?></strong>.</p>
      <p class="small text-muted mb-3">سيتم الدفع عند استلام الطلب.</p>
      <div class="d-flex flex-wrap gap-2 justify-content-center">
        <a href="<?= e($base) ?>/public/index.php" class="btn btn-primary rounded-pill">
          <i class="bi bi-shop"></i> متابعة التسوق
        </a>
        <a href="<?= e($base) ?>/public/order_view.php?id=<?= (int)$orderId ?>" class="btn btn-outline-secondary rounded-pill">
          عرض تفاصيل الطلب
        </a>
      </div>
    </div>

  <?php elseif ($orderCreated && $orderId && ($_POST['payment_method'] ?? '') === 'cliq'): ?>
    <div class="card p-3 mt-3 text-center">
      <h2 class="h6 mb-2">تعليمات الدفع كليك (CliQ)</h2>
      <ol class="small mb-3 text-start">
        <li>افتح تطبيق البنك واختر التحويل الفوري (CliQ).</li>
        <li>حوّل إلى الحساب / IBAN: <strong><?= e($_POST['cliq_iban'] ?? '') ?></strong></li>
        <li>المبلغ: <strong><?= e(price($total)) ?></strong></li>
        <li>استخدم مرجع التحويل (Reference): <strong><?= e($_POST['cliq_reference'] ?? '') ?></strong></li>
      </ol>
      <p class="small text-muted">بعد اكتمال التحويل سيتم تحديث حالة الطلب إلى مدفوع يدويًا.</p>
      <div class="d-flex flex-wrap gap-2 justify-content-center mt-2">
        <a href="<?= e($base) ?>/public/index.php" class="btn btn-outline-primary btn-sm rounded-pill">
          الرئيسية
        </a>
        <a href="<?= e($base) ?>/public/order_view.php?id=<?= (int)$orderId ?>" class="btn btn-secondary btn-sm rounded-pill">
          تفاصيل الطلب
        </a>
      </div>
    </div>

  <?php else: ?>

    <?php if (!$items): ?>
      <div class="alert alert-info mt-3 text-center">
        سلتك فارغة. <a href="<?= e($base) ?>/public/index.php">العودة للمتجر</a>
      </div>
    <?php else: ?>

      <div class="checkout-layout">

        <!-- نموذج البيانات -->
        <div class="checkout-main card p-3">
          <form method="post" id="checkoutForm">
            <input type="hidden" name="csrf" value="<?= e(csrf_token()) ?>">

            <div class="mb-3">
              <label class="form-label">الاسم الكامل</label>
              <input
                type="text"
                name="name"
                class="form-control"
                required
                value="<?= e($_POST['name'] ?? '') ?>">
            </div>

            <div class="mb-3">
              <label class="form-label">الهاتف</label>
              <input
                type="tel"
                name="phone"
                class="form-control"
                required
                value="<?= e($_POST['phone'] ?? '') ?>">
            </div>

            <div class="mb-3">
              <label class="form-label">العنوان</label>
              <textarea
                name="address"
                rows="3"
                class="form-control"
                required><?= e($_POST['address'] ?? '') ?></textarea>
            </div>

            <div class="mb-3">
              <label class="form-label">طريقة الدفع</label>
              <div class="form-check">
                <input
                  class="form-check-input"
                  type="radio"
                  name="payment_method"
                  id="pmCod"
                  value="cod"
                  <?= empty($_POST['payment_method']) || ($_POST['payment_method'] ?? '') === 'cod' ? 'checked' : '' ?>>
                <label class="form-check-label" for="pmCod">
                  الدفع عند التوصيل (COD)
                </label>
              </div>
              <div class="form-check">
                <input
                  class="form-check-input"
                  type="radio"
                  name="payment_method"
                  id="pmCliq"
                  value="cliq"
                  <?= ($_POST['payment_method'] ?? '') === 'cliq' ? 'checked' : '' ?>>
                <label class="form-check-label" for="pmCliq">
                  الدفع كليك (تحويل فوري)
                </label>
              </div>
              <div class="form-check">
                <input
                  class="form-check-input"
                  type="radio"
                  name="payment_method"
                  id="pmCard"
                  value="card"
                  <?= ($_POST['payment_method'] ?? '') === 'card' ? 'checked' : '' ?>>
                <label class="form-check-label" for="pmCard">
                  بطاقة فيزا / ماستر كارد
                </label>
              </div>
            </div>

            <!-- صندوق CliQ (مخفي إلا عند الاختيار) -->
            <div class="pay-box" id="boxCliq">
              <h6 class="fw-semibold mb-2">بيانات الدفع كليك</h6>
              <div class="mb-2">
                <label class="form-label">رقم الحساب / IBAN المستلم</label>
                <input
                  type="text"
                  name="cliq_iban"
                  class="form-control"
                  placeholder="مثال: JO12BANK00001234567890123456"
                  value="<?= e($_POST['cliq_iban'] ?? '') ?>">
              </div>
              <div class="mb-2">
                <label class="form-label">مرجع التحويل (Reference)</label>
                <input
                  type="text"
                  name="cliq_reference"
                  class="form-control"
                  placeholder="رقم فريد تستخدمه بالتحويل"
                  value="<?= e($_POST['cliq_reference'] ?? '') ?>">
              </div>
            </div>

            <!-- صندوق البطاقة (مخفي إلا عند الاختيار) -->
            <div class="pay-box" id="boxCard">
              <h6 class="fw-semibold mb-2">بيانات البطاقة</h6>
              <div class="mb-2">
                <label class="form-label">اسم حامل البطاقة</label>
                <input
                  type="text"
                  name="card_holder"
                  class="form-control"
                  value="<?= e($_POST['card_holder'] ?? '') ?>">
              </div>
              <div class="mb-2">
                <label class="form-label">رقم البطاقة</label>
                <input
                  type="text"
                  name="card_number"
                  inputmode="numeric"
                  class="form-control"
                  placeholder="4111 1111 1111 1111"
                  value="<?= e($_POST['card_number'] ?? '') ?>">
              </div>
              <div class="row g-2">
                <div class="col-6">
                  <label class="form-label">تاريخ الانتهاء (MM/YY)</label>
                  <input
                    type="text"
                    name="card_exp"
                    class="form-control"
                    placeholder="12/27"
                    value="<?= e($_POST['card_exp'] ?? '') ?>">
                </div>
                <div class="col-6">
                  <label class="form-label">CVV</label>
                  <input
                    type="text"
                    name="card_cvv"
                    class="form-control"
                    placeholder="123"
                    value="<?= e($_POST['card_cvv'] ?? '') ?>">
                </div>
              </div>
            </div>

            <div class="d-flex flex-wrap gap-2 mt-3 justify-content-center justify-content-md-start">
              <button class="btn btn-success rounded-pill">
                <i class="bi bi-check2-circle"></i> تأكيد الطلب
              </button>
              <a href="<?= e($base) ?>/public/cart.php" class="btn btn-outline-secondary rounded-pill">
                عودة للسلة
              </a>
              <a href="<?= e($base) ?>/public/index.php" class="btn btn-outline-primary rounded-pill">
                متابعة التسوق
              </a>
            </div>
          </form>
        </div>

        <!-- ملخص السلة -->
        <aside class="checkout-summary card p-3">
          <h6 class="fw-semibold mb-2 text-center">ملخص السلة</h6>
          <ul class="list-group mb-3">
            <?php foreach ($items as $it): ?>
              <li class="list-group-item d-flex justify-content-between align-items-center">
                <div>
                  <div class="fw-semibold"><?= e($it['name']) ?></div>
                  <div class="small text-muted">
                    الكمية: <?= (int)$it['qty'] ?> × <?= e(price($it['price'])) ?>
                  </div>
                </div>
                <div><?= e(price($it['subtotal'])) ?></div>
              </li>
            <?php endforeach; ?>
            <li class="list-group-item d-flex justify-content-between">
              <span class="fw-bold">الإجمالي</span>
              <span class="fw-bold"><?= e(price($total)) ?></span>
            </li>
          </ul>
        </aside>
      </div>

    <?php endif; ?>
  <?php endif; ?>
</div>

<?php include __DIR__ . '/partials/shop_footer.php'; ?>

<script>
  const radios = document.querySelectorAll('input[name="payment_method"]');
  const boxCliq = document.getElementById('boxCliq');
  const boxCard = document.getElementById('boxCard');

  function updateBoxes() {
    const val = document.querySelector('input[name="payment_method"]:checked')?.value;
    if (!boxCliq || !boxCard) return;
    boxCliq.classList.toggle('active', val === 'cliq');
    boxCard.classList.toggle('active', val === 'card');
  }
  radios.forEach(r => r.addEventListener('change', updateBoxes));
  updateBoxes();
</script>