<?php
declare(strict_types=1);

require_once __DIR__ . '/../includes/db.php';
require_once __DIR__ . '/../includes/functions.php';

header('Content-Type: application/json; charset=utf-8');

function responder(array $payload, int $status = 200): void
{
    http_response_code($status);
    echo json_encode($payload, JSON_UNESCAPED_UNICODE);
    exit;
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    responder(['ok' => false, 'error' => 'Método no permitido.'], 405);
}
if (!csrfValidate()) {
    responder(['ok' => false, 'error' => 'Token CSRF inválido. Recargue la página e intente de nuevo.'], 419);
}

$conn = db();
$accion = $_POST['accion'] ?? '';
$factura = parseCodigo($_POST['factura'] ?? null);

if ($factura === null) {
    responder(['ok' => false, 'error' => 'Factura no especificada.'], 400);
}

$stmtFactura = $conn->prepare('SELECT factura FROM facturas WHERE factura = ?');
$stmtFactura->bind_param('s', $factura);
$stmtFactura->execute();
if (!$stmtFactura->get_result()->fetch_assoc()) {
    responder(['ok' => false, 'error' => 'La factura no existe.'], 404);
}
$stmtFactura->close();

switch ($accion) {
    case 'agregar':
        agregarLinea($conn, $factura);
        break;
    case 'editar':
        editarLinea($conn, $factura);
        break;
    case 'eliminar':
        eliminarLinea($conn, $factura);
        break;
    default:
        responder(['ok' => false, 'error' => 'Acción no reconocida.'], 400);
}

function agregarLinea(mysqli $conn, string $factura): void
{
    $codigoProducto = parseCodigo($_POST['codigo_producto'] ?? null);
    $cantidad = parseDecimal($_POST['cantidad'] ?? '0');
    $precio = parseDecimal($_POST['precio'] ?? '0');

    if ($codigoProducto === null || $cantidad <= 0 || $precio < 0) {
        responder(['ok' => false, 'error' => 'Código de producto, cantidad y precio son obligatorios.'], 400);
    }

    $stmtProd = $conn->prepare('SELECT titulo, iva FROM productos WHERE codigo = ?');
    $stmtProd->bind_param('s', $codigoProducto);
    $stmtProd->execute();
    $producto = $stmtProd->get_result()->fetch_assoc();
    $stmtProd->close();
    if (!$producto) {
        responder(['ok' => false, 'error' => 'El producto no existe en el maestro.'], 400);
    }

    $tarifaIva = (float) $producto['iva'];
    $valorNeto = round($cantidad * $precio, 2);
    $valorIva = round($valorNeto * $tarifaIva / 100, 2);
    $hash = sha1($factura . '|' . $codigoProducto . '|' . uniqid('', true));

    $stmtInfo = $conn->prepare('SELECT codigo_cliente, cod_vendedor, cod_regional, fecha FROM facturas WHERE factura = ?');
    $stmtInfo->bind_param('s', $factura);
    $stmtInfo->execute();
    $info = $stmtInfo->get_result()->fetch_assoc();
    $stmtInfo->close();

    $stmt = $conn->prepare(
        'INSERT INTO ventas_detalle
            (factura, codigo_cliente, codigo_producto, fecha, cantidad, precio, valor_neto, tarifa_iva, valor_iva, cod_vendedor, cod_regional, linea_hash)
         VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
    );
    $stmt->bind_param(
        'ssssdddddsss',
        $factura, $info['codigo_cliente'], $codigoProducto, $info['fecha'], $cantidad, $precio,
        $valorNeto, $tarifaIva, $valorIva, $info['cod_vendedor'], $info['cod_regional'], $hash
    );
    $stmt->execute();
    $stmt->close();

    recalcularFactura($conn, $factura);
    responder(['ok' => true]);
}

function editarLinea(mysqli $conn, string $factura): void
{
    $id = (int) ($_POST['id'] ?? 0);
    $cantidad = parseDecimal($_POST['cantidad'] ?? '0');
    $precio = parseDecimal($_POST['precio'] ?? '0');

    if ($id <= 0 || $cantidad <= 0 || $precio < 0) {
        responder(['ok' => false, 'error' => 'Cantidad y precio deben ser válidos.'], 400);
    }

    $stmtLinea = $conn->prepare('SELECT tarifa_iva FROM ventas_detalle WHERE id = ? AND factura = ?');
    $stmtLinea->bind_param('is', $id, $factura);
    $stmtLinea->execute();
    $linea = $stmtLinea->get_result()->fetch_assoc();
    $stmtLinea->close();
    if (!$linea) {
        responder(['ok' => false, 'error' => 'La línea no pertenece a esta factura.'], 404);
    }

    $tarifaIva = (float) $linea['tarifa_iva'];
    $valorNeto = round($cantidad * $precio, 2);
    $valorIva = round($valorNeto * $tarifaIva / 100, 2);

    $stmt = $conn->prepare(
        'UPDATE ventas_detalle SET cantidad = ?, precio = ?, valor_neto = ?, valor_iva = ?
         WHERE id = ? AND factura = ?'
    );
    $stmt->bind_param('ddddis', $cantidad, $precio, $valorNeto, $valorIva, $id, $factura);
    $stmt->execute();
    $stmt->close();

    recalcularFactura($conn, $factura);
    responder(['ok' => true]);
}

function eliminarLinea(mysqli $conn, string $factura): void
{
    $id = (int) ($_POST['id'] ?? 0);
    if ($id <= 0) {
        responder(['ok' => false, 'error' => 'Línea no especificada.'], 400);
    }

    $stmt = $conn->prepare('DELETE FROM ventas_detalle WHERE id = ? AND factura = ?');
    $stmt->bind_param('is', $id, $factura);
    $stmt->execute();
    $eliminada = $stmt->affected_rows > 0;
    $stmt->close();

    if (!$eliminada) {
        responder(['ok' => false, 'error' => 'La línea no pertenece a esta factura.'], 404);
    }

    recalcularFactura($conn, $factura);
    responder(['ok' => true]);
}
