<?php
error_reporting(E_ALL ^ E_NOTICE);

header("Access-Control-Allow-Methods: POST");
header("Content-Type: application/json; charset=utf-8");

include_once '../conexion.php';

function responder($success, $message, $extra = [], $httpCode = 200)
{
    http_response_code($httpCode);

    echo json_encode(
        array_merge([
            'success' => $success,
            'message' => $message
        ], $extra),
        JSON_UNESCAPED_UNICODE
    );
    exit;
}

$bodyRequest = file_get_contents("php://input");
$datos = json_decode($bodyRequest, true);

if (!is_array($datos)) {
    responder(false, 'El cuerpo de la solicitud no contiene un JSON válido.', [], 400);
}

if (!isset($datos[0]) || !is_numeric($datos[0])) {
    responder(false, 'Parámetro operacion_id inválido.', [], 400);
}

if (!isset($datos[1]) || !is_string($datos[1])) {
    responder(false, 'Parámetro campo inválido.', [], 400);
}

if (!array_key_exists(2, $datos)) {
    responder(false, 'Parámetro valor inválido.', [], 400);
}

if (!isset($datos[3]) || !is_numeric($datos[3])) {
    responder(false, 'Parámetro empresa_id inválido.', [], 400);
}

$operacion_id = (int) $datos[0];
$campo = trim($datos[1]);
$empresa_id = (int) $datos[3];

// Acepta booleanos reales, 0/1 y textos true/false.
$valor = filter_var($datos[2], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);

if ($valor === null) {
    responder(false, 'El valor debe ser booleano.', [], 400);
}

// Lista blanca obligatoria: evita que el nombre de columna sea inyectado.
$camposPermitidos = [
    'activo',
    'mostrar_caja',
    'mostrar_banco'
];

if (!in_array($campo, $camposPermitidos, true)) {
    responder(false, 'El campo solicitado no está permitido.', [], 400);
}

try {
    $sql = "UPDATE operaciones_caja
            SET {$campo} = :valor
            WHERE id = :operacion_id
              AND empresa_id = :empresa_id
            RETURNING id, nombre, activo, mostrar_caja, mostrar_banco";

    $stmt = $conn->prepare($sql);
    $stmt->bindValue(':valor', $valor, PDO::PARAM_BOOL);
    $stmt->bindValue(':operacion_id', $operacion_id, PDO::PARAM_INT);
    $stmt->bindValue(':empresa_id', $empresa_id, PDO::PARAM_INT);
    $stmt->execute();

    $operacion = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$operacion) {
        responder(
            false,
            'No se encontró la operación para la empresa indicada.',
            [],
            404
        );
    }

    // Normalizar los booleanos para que lleguen como true/false en JSON.
    $operacion['activo'] = filter_var($operacion['activo'], FILTER_VALIDATE_BOOLEAN);
    $operacion['mostrar_caja'] = filter_var($operacion['mostrar_caja'], FILTER_VALIDATE_BOOLEAN);
    $operacion['mostrar_banco'] = filter_var($operacion['mostrar_banco'], FILTER_VALIDATE_BOOLEAN);

    responder(true, 'Operación actualizada correctamente.', [
        'operacion' => $operacion,
        'campo' => $campo,
        'valor' => $valor
    ]);

} catch (PDOException $e) {
    error_log('operaciones_actualizar_columna.php: ' . $e->getMessage());

    responder(
        false,
        'Ocurrió un error al actualizar la operación.',
        [],
        500
    );
}
