<?php ob_start();
require_once '../files/guardiankey.php'; ?>
<?php
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/../logs/php_errors.log');
error_reporting(E_ALL);

include_once 'db_connection.php';

$response = [];

try {
    $data = json_decode(file_get_contents('php://input'), true);

    if (json_last_error() !== JSON_ERROR_NONE) {
        error_log("Error al decodificar JSON en invoice-update.php: " . json_last_error_msg());
        throw new Exception('Error al procesar los datos enviados.');
    }

    // Validar datos requeridos para la actualización de la factura
    if (empty($data['id']) || empty($data['invoice_date']) || empty($data['status']) || empty($data['client_id']) || !isset($data['items'])) {
        throw new Exception('Datos incompletos para la actualización de la factura. ID, fecha, estado, ID de cliente e ítems son requeridos.');
    }
    if (!is_array($data['items'])) { // Los ítems pueden estar vacíos si se eliminan todos
        throw new Exception('Los ítems de la factura deben ser un array.');
    }

    // ✅ CORRECCIÓN: Sanitizar y validar todas las entradas
    $invoice_db_id = filter_var($data['id'], FILTER_VALIDATE_INT);
    $client_id = filter_var($data['client_id'], FILTER_VALIDATE_INT);

    if ($invoice_db_id === false) {
        throw new Exception('ID de factura inválido.');
    }
    if ($client_id === false) {
        throw new Exception('ID de cliente inválido.');
    }

    $invoice_date = filter_var($data['invoice_date'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
    $due_date = !empty($data['due_date']) ? filter_var($data['due_date'], FILTER_SANITIZE_FULL_SPECIAL_CHARS) : null;
    $status = filter_var(trim($data['status']), FILTER_SANITIZE_FULL_SPECIAL_CHARS);
    $tax_rate = filter_var($data['tax_rate'] ?? 0.00, FILTER_VALIDATE_FLOAT);
    $items = $data['items']; // Array de [description, unit_price, quantity]

    // Validar que el estado sea uno de los permitidos para facturas
    $allowed_statuses = ['generada', 'enviada', 'cancelada', 'atrasada', 'pagada'];
    if (!in_array($status, $allowed_statuses)) {
        throw new Exception('Estado de factura inválido. Estados permitidos: ' . implode(', ', $allowed_statuses));
    }

    // Calcular subtotal y total_amount antes de actualizar
    $subtotal = 0;
    foreach ($items as $item) {
        if (!isset($item[0], $item[1], $item[2])) { // description, unit_price, quantity
            throw new Exception('Formato de ítem inválido. Cada ítem debe tener descripción, precio y cantidad.');
        }
        $item_description = filter_var($item[0], FILTER_SANITIZE_FULL_SPECIAL_CHARS); // Sanitizar descripción
        $item_price = filter_var($item[1], FILTER_VALIDATE_FLOAT);
        $item_quantity = filter_var($item[2], FILTER_VALIDATE_INT);
        if ($item_price === false || $item_quantity === false || $item_quantity < 0) { // Permitir cantidad 0 si se quiere representar un ítem sin costo
            throw new Exception('Precio o cantidad de ítem inválido.');
        }
        $subtotal += ($item_price * $item_quantity);
    }
    $total_amount = $subtotal + ($subtotal * ($tax_rate / 100));

    $pdo->beginTransaction();

    // Actualizar la factura principal
    $stmt = $pdo->prepare(
        "UPDATE invoices
         SET client_id = ?, invoice_date = ?, due_date = ?, status = ?, tax_rate = ?, subtotal = ?, total_amount = ?, updated_at = NOW()
         WHERE id = ?"
    );
    $stmt->execute([
        $client_id,
        $invoice_date,
        $due_date,
        $status,
        $tax_rate,
        $subtotal,
        $total_amount,
        $invoice_db_id
    ]);

    // Eliminar ítems existentes de la factura para reinsertar los nuevos
    $stmt_delete_items = $pdo->prepare("DELETE FROM invoice_items WHERE invoice_id = ?");
    $stmt_delete_items->execute([$invoice_db_id]);

    // Insertar los nuevos ítems de la factura
    if (!empty($items)) {
        $stmt_insert_items = $pdo->prepare(
            "INSERT INTO invoice_items (invoice_id, description, unit_price, quantity)
             VALUES (?, ?, ?, ?)"
        );
        foreach ($items as $item) {
            $item_description = filter_var($item[0], FILTER_SANITIZE_FULL_SPECIAL_CHARS); // Re-sanitizar para insertar
            $item_price = filter_var($item[1], FILTER_VALIDATE_FLOAT);
            $item_quantity = filter_var($item[2], FILTER_VALIDATE_INT);

            $stmt_insert_items->execute([
                $invoice_db_id,
                $item_description,
                $item_price,
                $item_quantity
            ]);
        }
    }

    $pdo->commit();

    $response = [
        'success' => true,
        'message' => 'Factura actualizada con éxito.',
        'id' => $invoice_db_id // Devuelve el ID de la DB
    ];

} catch (PDOException $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    error_log("PDO Error en invoice-update.php: " . $e->getMessage());
    $response = ['success' => false, 'message' => 'Error de Base de Datos al actualizar factura. Por favor, inténtalo de nuevo más tarde.'];
} catch (Exception $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    error_log("General Error en invoice-update.php: " . $e->getMessage());
    $response = ['success' => false, 'message' => $e->getMessage()];
}

ob_end_clean();
header('Content-Type: application/json');
echo json_encode($response);
exit;