<?php
/**
 * POST /api/payment/upload_proof.php
 * WAVE E — Full Kernel Replace
 * Upload payment proof image for offline payments
 */
require_once __DIR__ . '/../../config.php';
require_once __DIR__ . '/../../engine/Kernel.php';
require_once __DIR__ . '/../../engine/InvoiceEngine.php';

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    Kernel::fail('method_not_allowed', '', 405);
}

$ctx    = Kernel::handle(['auth' => true]);
$userId = (int)$ctx['user']['id'];

$invoiceId = (int)($_POST['invoice_id'] ?? 0);
if (!$invoiceId) Kernel::fail('invoice_id_required', 'رقم الفاتورة مطلوب', 400);

if (empty($_FILES['proof'])) {
    Kernel::fail('file_required', 'ملف الإيصال مطلوب', 400);
}

$file = $_FILES['proof'];
$allowed = ['image/jpeg', 'image/png', 'image/webp', 'image/gif'];
$mime = mime_content_type($file['tmp_name']);

if (!in_array($mime, $allowed)) {
    Kernel::fail('invalid_file_type', 'نوع الملف غير مدعوم — JPEG/PNG فقط', 415);
}
if ($file['size'] > 5 * 1024 * 1024) {
    Kernel::fail('file_too_large', 'حجم الملف يجب أن يكون أقل من 5MB', 413);
}

$dir = rtrim(UPLOAD_PATH, '/') . '/proofs/';
if (!is_dir($dir)) mkdir($dir, 0755, true);
$ext      = pathinfo($file['name'], PATHINFO_EXTENSION) ?: 'jpg';
$filename = 'proof_' . $userId . '_' . $invoiceId . '_' . time() . '.' . $ext;
$fullPath = $dir . $filename;

if (!move_uploaded_file($file['tmp_name'], $fullPath)) {
    Kernel::fail('upload_failed', 'فشل رفع الملف — حاول مرة أخرى', 500);
}

try {
    $result = InvoiceEngine::attachProof($invoiceId, $userId, $fullPath);

    if (!($result['success'] ?? false)) {
        @unlink($fullPath);
    }

    Logger::info('payment_proof_uploaded', [
        'user_id'    => $userId,
        'invoice_id' => $invoiceId,
        'file'       => $filename,
    ]);

    if ($result['success'] ?? false) {
        Kernel::respond($result);
    } else {
        Kernel::fail('proof_rejected', $result['message'] ?? 'رُفض الإيصال', 422);
    }

} catch (Throwable $e) {
    @unlink($fullPath);
    Logger::error('upload_proof_failed', ['user_id' => $userId, 'error' => $e->getMessage()]);
    Kernel::fail('processing_failed', 'فشل معالجة الإيصال', 500);
}
