<?php
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

require_once(__DIR__ . '/../config.php');

 $data = json_decode(file_get_contents("php://input"));

 $response = ['success' => false, 'message' => ''];

if (isset($data->slug_tienda) && isset($data->credito_id)) {
    $slug_tienda = $mysqli->real_escape_string($data->slug_tienda);
    $credito_id = (int)$data->credito_id;

    // --- VALIDACION CLAVE: Verificar si hay abonos ---
    $check_abonos_sql = "SELECT COUNT(*) AS total_abonos FROM abonos_creditos WHERE credito_id = ?";
    $stmt_check = $mysqli->prepare($check_abonos_sql);
    $stmt_check->bind_param("i", $credito_id);
    $stmt_check->execute();
    $result = $stmt_check->get_result();
    $row = $result->fetch_assoc();

    if ($row['total_abonos'] > 0) {
        $response['message'] = "No se puede anular el credito porque ya tiene abonos registrados.";
    } else {
        // --- Si no hay abonos, proceder a anular el credito Y la factura ---
        $mysqli->begin_transaction();

        try {
            // --- PASO 1: Obtener el ID de la factura asociada al credito ---
            $get_factura_id_sql = "
                SELECT 
                    fa.id AS factura_id_a_anular, 
                    fa.numero_factura AS numero_factura_a_anular
                FROM creditos cr
                LEFT JOIN facturas fa ON cr.factura_id = fa.id
                WHERE cr.id = ? AND cr.slug_tienda = ?
            ";
            $stmt_get_factura_id = $mysqli->prepare($get_factura_id_sql);
            $stmt_get_factura_id->bind_param("is", $credito_id, $slug_tienda);
            $stmt_get_factura_id->execute();
            $factura_result = $stmt_get_factura_id->get_result();
            
            if ($factura_result->num_rows === 0) {
                throw new Exception("No se encontro la factura asociada al credito especificado para esta tienda.");
            }

            $factura_data = $factura_result->fetch_assoc();
            $factura_id_to_update = $factura_data['factura_id_a_anular'];
            $numero_factura_a_anular = $factura_data['numero_factura_a_anular'];
            $stmt_get_factura_id->close();

            // --- PASO 2: Obtener los detalles de los productos para devolver al stock ---
            $stmt_detalles = $mysqli->prepare("SELECT articulo_id, cantidad FROM factura_detalles WHERE factura_id = ?");
            $stmt_detalles->bind_param("i", $factura_id_to_update);
            $stmt_detalles->execute();
            $detalles = $stmt_detalles->get_result()->fetch_all(MYSQLI_ASSOC);
            $stmt_detalles->close();

            // --- NUEVA LOGICA: Devolver stock y registrar movimiento ---
            
            // Preparar las sentencias fuera del bucle para mayor eficiencia
            $stmt_get_stock = $mysqli->prepare("SELECT stock FROM articulos WHERE id = ? FOR UPDATE");
            $stmt_update_stock = $mysqli->prepare("UPDATE articulos SET stock = stock + ? WHERE id = ?");
            
            // Preparar la sentencia para el movimiento de inventario
            $motivo_movimiento = "Anulacion de Credito";
            $batch_id = uniqid('anul_cred_'); // Generar un ID unico para todo el lote de movimientos
            $stmt_insert_movimiento = $mysqli->prepare("
                INSERT INTO inventario_movimientos (
                    articulo_id, slug_tienda, cantidad_ingresada, cantidad_anterior, 
                    cantidad_actual, motivo, nota, batch_id
                ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
            ");

            foreach ($detalles as $item) {
                // a. Obtener el stock ANTERIOR del articulo
                $stmt_get_stock->bind_param("s", $item['articulo_id']);
                $stmt_get_stock->execute();
                $stock_result = $stmt_get_stock->get_result();
                $stock_data = $stock_result->fetch_assoc();
                
                if (!$stock_data) {
                    throw new Exception("Articulo con ID {$item['articulo_id']} no encontrado para consultar stock.");
                }
                $cantidad_anterior = $stock_data['stock'];

                // b. Calcular la cantidad ACTUAL
                $cantidad_actual = $cantidad_anterior + $item['cantidad'];

                // c. Devolver el stock al articulo
                $stmt_update_stock->bind_param("is", $item['cantidad'], $item['articulo_id']);
                if (!$stmt_update_stock->execute()) {
                    throw new Exception("Error al devolver stock para el articulo ID {$item['articulo_id']}: " . $stmt_update_stock->error);
                }

                // d. Registrar el movimiento en inventario_movimientos
                $cantidad_ingresada = $item['cantidad']; // Es un ingreso, por lo que es positivo
                $nota_detalle = "Anulacion de credito ID: {$credito_id}. Factura No.: {$numero_factura_a_anular}.";
                
                $stmt_insert_movimiento->bind_param(
                    "ssiiisss",
                    $item['articulo_id'], // articulo_id
                    $slug_tienda,         // slug_tienda
                    $cantidad_ingresada,  // cantidad_ingresada (positivo)
                    $cantidad_anterior,   // cantidad_anterior
                    $cantidad_actual,     // cantidad_actual
                    $motivo_movimiento,   // motivo
                    $nota_detalle,        // nota (detalles)
                    $batch_id             // batch_id
                );
                if (!$stmt_insert_movimiento->execute()) {
                    throw new Exception("Error al registrar movimiento de inventario para el articulo ID {$item['articulo_id']}: " . $stmt_insert_movimiento->error);
                }
            }

            // Cerrar las sentencias del bucle
            $stmt_get_stock->close();
            $stmt_update_stock->close();
            $stmt_insert_movimiento->close();
            
            // --- PASO 3: Actualizar el estado del credito a 'anulado' ---
            $update_credito_sql = "UPDATE creditos SET estado = 'anulado', updated_at = NOW() WHERE id = ? AND slug_tienda = ?";
            $stmt_update_credito = $mysqli->prepare($update_credito_sql);
            $stmt_update_credito->bind_param("is", $credito_id, $slug_tienda);
            
            if ($stmt_update_credito->execute() && $stmt_update_credito->affected_rows > 0) {
                
                // --- PASO 4: Actualizar la factura usando su ID unico ---
                $update_factura_sql = "UPDATE facturas SET estado = 'cancelada' WHERE id = ?";
                $stmt_update_factura = $mysqli->prepare($update_factura_sql);
                $stmt_update_factura->bind_param("i", $factura_id_to_update);
                $stmt_update_factura->execute();

                // Verificamos si la factura tambien fue actualizada correctamente
                if ($stmt_update_factura->affected_rows > 0) {
                    // Todas las operaciones fueron exitosas. Confirmamos la transaccion.
                    $mysqli->commit();
                    $response['success'] = true;
                    $response['message'] = "Credito y factura No. {$numero_factura_a_anular} anulados correctamente. Stock devuelto.";
                } else {
                    // Este es un caso critico: el credito se actualizo, pero la factura no se encontro o ya estaba cancelada.
                    // Indica una inconsistencia en los datos. Revertimos todo.
                    $mysqli->rollback();
                    $response['message'] = "Error de integridad: El credito se anulo, pero no se encontro la factura asociada o ya estaba cancelada. Contacte al administrador.";
                }
                $stmt_update_factura->close();

            } else {
                $mysqli->rollback();
                $response['message'] = "No se encontro el credito o no se pudo actualizar.";
            }
            $stmt_update_credito->close();

        } catch (Exception $e) {
            // Si algo salio mal, deshacer todos los cambios
            $mysqli->rollback();
            $response['message'] = "Error en el proceso: " . $e->getMessage();
        }
    }
    $stmt_check->close();

} else {
    $response['message'] = "Faltan datos requeridos (slug_tienda, credito_id).";
}

 $mysqli->close();
echo json_encode($response);
?>