<?php
// eliminar_factura.php
require_once 'conexion3.php';

function redir($proveedor_id, $msg = '', $err = '') {
    $qs = 'proveedor_id='.(int)$proveedor_id;
    if ($msg !== '') $qs .= '&msg='.urlencode($msg);
    if ($err !== '') $qs .= '&err='.urlencode($err);
    header('Location: cuenta_proveedor.php?'.$qs);
    exit;
}

$factura_id   = isset($_POST['factura_id'])   ? (int)$_POST['factura_id']   : 0;
$proveedor_id = isset($_POST['proveedor_id']) ? (int)$_POST['proveedor_id'] : 0;

if ($factura_id <= 0 || $proveedor_id <= 0) {
    redir($proveedor_id, '', 'Parámetros inválidos.');
}

// 1) Traer datos base + validar que la factura corresponde al proveedor
$stmt = $conn->prepare("SELECT id, proveedor_id, numero_factura, monto, pagado FROM facturas WHERE id = ? LIMIT 1");
$stmt->bind_param('i', $factura_id);
$stmt->execute();
$res = $stmt->get_result();
$f = $res->fetch_assoc();
$stmt->close();

if (!$f || (int)$f['proveedor_id'] !== $proveedor_id) {
    redir($proveedor_id, '', 'Factura inexistente o no pertenece al proveedor.');
}

// 2) Reglas de negocio: sin pagos ni imputaciones y sin entregas registradas
// 2.a) pagos/imputaciones
$stmt = $conn->prepare("SELECT COUNT(*) AS c FROM pagos_facturas WHERE factura_id = ?");
$stmt->bind_param('i', $factura_id);
$stmt->execute();
$pagos = $stmt->get_result()->fetch_assoc();
$stmt->close();

if ((int)$pagos['c'] > 0) {
    redir($proveedor_id, '', 'No se puede eliminar: la factura tiene pagos imputados.');
}

// 2.b) campo pagado de la factura debe ser 0 (defensa extra)
if ((float)$f['pagado'] > 0.000001) {
    redir($proveedor_id, '', 'No se puede eliminar: la factura registra importes pagados.');
}

// 2.c) entregas registradas en items
$stmt = $conn->prepare("
    SELECT COALESCE(SUM(CASE WHEN cantidad_entregada > 0 THEN 1 ELSE 0 END),0) AS entregas
    FROM factura_items WHERE factura_id = ?
");
$stmt->bind_param('i', $factura_id);
$stmt->execute();
$ent = $stmt->get_result()->fetch_assoc();
$stmt->close();

if ((int)$ent['entregas'] > 0) {
    redir($proveedor_id, '', 'No se puede eliminar: hay ítems con entregas registradas.');
}

// 3) Borrado en transacción
$conn->begin_transaction();
try {
    // 3.a) Detalles IVA
    $stmt = $conn->prepare("DELETE FROM factura_iva_detalle WHERE factura_id = ?");
    $stmt->bind_param('i', $factura_id);
    $stmt->execute();
    $stmt->close();

    // 3.b) Items
    $stmt = $conn->prepare("DELETE FROM factura_items WHERE factura_id = ?");
    $stmt->bind_param('i', $factura_id);
    $stmt->execute();
    $stmt->close();

    // 3.c) Price
    $stmt = $conn->prepare("DELETE FROM factura_price WHERE factura_id = ?");
    $stmt->bind_param('i', $factura_id);
    $stmt->execute();
    $stmt->close();

    // 3.d) Cabecera
    $stmt = $conn->prepare("DELETE FROM facturas WHERE id = ? LIMIT 1");
    $stmt->bind_param('i', $factura_id);
    $stmt->execute();
    $stmt->close();

    $conn->commit();
    redir($proveedor_id);
} catch (Throwable $e) {
    $conn->rollback();
    redir($proveedor_id, '', 'Error al eliminar: '.$e->getMessage());
}
