<?php
// Prevenir acceso directo
if (!defined('BASEPATH')) exit('No direct script access allowed');

switch ($tipo) {
    case 'imprimirTicket':
    case 'generarTicket':
        $venta_id = intval($datapost['venta_id'] ?? 0);

        if ($venta_id <= 0) {
            sendResponse(false, "ID de venta requerido");
        }

        try {
            // Obtener datos de la venta
            $query = "SELECT
                v.id,
                v.folio,
                v.cliente_id,
                v.cliente_nombre,
                v.usuario_id,
                v.usuario_nombre,
                v.subtotal,
                v.impuesto,
                v.descuento,
                v.total,
                v.metodo_pago,
                v.tipo_entrega,
                v.direccion_entrega,
                v.estado,
                v.observaciones,
                v.fecha_creacion
            FROM ventas v
            WHERE v.id = ?";

            $stmt = $conn->prepare($query);
            $stmt->bind_param("i", $venta_id);
            $stmt->execute();
            $result = $stmt->get_result();

            if ($row = $result->fetch_assoc()) {
                // Obtener detalles de la venta
                $detallesQuery = "SELECT
                    id,
                    producto_id,
                    producto_nombre,
                    cantidad,
                    precio_unitario,
                    subtotal,
                    impuesto,
                    descuento,
                    total
                FROM venta_detalles
                WHERE venta_id = ?
                ORDER BY id ASC";

                $detallesStmt = $conn->prepare($detallesQuery);
                $detallesStmt->bind_param("i", $venta_id);
                $detallesStmt->execute();
                $detallesResult = $detallesStmt->get_result();

                $detalles = [];
                while ($detRow = $detallesResult->fetch_assoc()) {
                    $detalles[] = [
                        'id' => intval($detRow['id']),
                        'producto_id' => intval($detRow['producto_id']),
                        'producto_nombre' => $detRow['producto_nombre'],
                        'cantidad' => floatval($detRow['cantidad']),
                        'precio_unitario' => floatval($detRow['precio_unitario']),
                        'subtotal' => floatval($detRow['subtotal']),
                        'impuesto' => floatval($detRow['impuesto']),
                        'descuento' => floatval($detRow['descuento']),
                        'total' => floatval($detRow['total'])
                    ];
                }

                // Generar ticket en formato texto
                $ticket = generarTicketTexto([
                    'id' => intval($row['id']),
                    'folio' => $row['folio'],
                    'cliente_id' => $row['cliente_id'] ? intval($row['cliente_id']) : null,
                    'cliente_nombre' => $row['cliente_nombre'] ?? 'Cliente General',
                    'usuario_id' => intval($row['usuario_id']),
                    'usuario_nombre' => $row['usuario_nombre'],
                    'subtotal' => floatval($row['subtotal']),
                    'impuesto' => floatval($row['impuesto']),
                    'descuento' => floatval($row['descuento']),
                    'total' => floatval($row['total']),
                    'metodo_pago' => $row['metodo_pago'],
                    'tipo_entrega' => $row['tipo_entrega'],
                    'direccion_entrega' => $row['direccion_entrega'],
                    'estado' => $row['estado'],
                    'observaciones' => $row['observaciones'],
                    'detalles' => $detalles,
                    'fecha_creacion' => $row['fecha_creacion']
                ]);

                sendResponse(true, "Ticket generado exitosamente", [
                    'ticket' => $ticket,
                    'venta_id' => $venta_id,
                    'folio' => $row['folio']
                ]);
            } else {
                sendResponse(false, "Venta no encontrada");
            }

        } catch (Exception $e) {
            sendResponse(false, "Error al generar ticket: " . $e->getMessage());
        }
        break;

    default:
        sendResponse(false, "Operación no válida para tickets");
        break;
}

// Función para generar ticket en formato texto
function generarTicketTexto($venta) {
    global $conn;
    $ancho = 35; // Ancho del ticket en caracteres (ajustado para impresora térmica)
    $linea = str_repeat('=', $ancho);
    $lineaPunteada = str_repeat('-', $ancho);

    // Leer configuraciones de impresión
    $desgloseIva = false;
    $totalEnLetra = false;
    $stmtConf = $conn->prepare("SELECT clave, valor FROM configuraciones WHERE clave IN ('impresion_desglose_iva', 'impresion_total_en_letra')");
    if ($stmtConf) {
        $stmtConf->execute();
        $resConf = $stmtConf->get_result();
        while ($rowConf = $resConf->fetch_assoc()) {
            if ($rowConf['clave'] === 'impresion_desglose_iva') {
                $desgloseIva = ($rowConf['valor'] === 'true' || $rowConf['valor'] === '1');
            }
            if ($rowConf['clave'] === 'impresion_total_en_letra') {
                $totalEnLetra = ($rowConf['valor'] === 'true' || $rowConf['valor'] === '1');
            }
        }
        $stmtConf->close();
    }

    // Encabezado
    $ticket = "\n";
    $ticket .= centrarTexto("ABARROTES", $ancho) . "\n";
    $ticket .= centrarTexto("PUNTO DE VENTA", $ancho) . "\n";
    $ticket .= $linea . "\n";

    // Información de la venta
    $ticket .= "Folio: " . $venta['folio'] . "\n";
    $ticket .= "Fecha: " . date('d/m/Y H:i:s', strtotime($venta['fecha_creacion'])) . "\n";
    $ticket .= "Cliente: " . $venta['cliente_nombre'] . "\n";
    $ticket .= "Atendido por: " . $venta['usuario_nombre'] . "\n";

    // Información de entrega
    if ($venta['tipo_entrega'] === 'domicilio') {
        $ticket .= "ENTREGA: DOMICILIO\n";
        if (!empty($venta['direccion_entrega'])) {
            $ticket .= "Direccion:\n";
            $ticket .= wordwrap($venta['direccion_entrega'], $ancho - 2, "\n", true) . "\n";
        }
    } else {
        $ticket .= "ENTREGA: PICKUP (Recoger en tienda)\n";
    }

    $ticket .= $linea . "\n";

    // Encabezado de productos
    $hIzq = '  CANT/UNID';
    $hCentro = 'P.U';
    $hDer = 'IMPORTE';
    $hEspacio = $ancho - mb_strlen($hIzq) - mb_strlen($hCentro) - mb_strlen($hDer);
    if ($hEspacio < 2) $hEspacio = 2;
    $hEspIzq = intval($hEspacio / 2);
    $hEspDer = $hEspacio - $hEspIzq;
    $ticket .= $hIzq . str_repeat(' ', $hEspIzq) . $hCentro . str_repeat(' ', $hEspDer) . $hDer . "\n";
    $ticket .= $lineaPunteada . "\n";

    // Detalles de productos (2 líneas por artículo, mismo formato que mostrador)
    foreach ($venta['detalles'] as $detalle) {
        $nombre = $detalle['producto_nombre'];
        $cant = rtrim(rtrim(number_format($detalle['cantidad'], 2), '0'), '.');
        $precioUnit = '$' . number_format($detalle['precio_unitario'], 2);
        $subtotalDet = '$' . number_format($detalle['total'], 2);

        // Línea 1: nombre (truncado al ancho)
        if (mb_strlen($nombre) > $ancho) {
            $nombre = mb_substr($nombre, 0, $ancho - 1) . '.';
        }
        $ticket .= $nombre . "\n";

        // Línea 2: cant unidad | p.u. centrado | subtotal derecha
        $izq = '  ' . $cant;
        $centro = $precioUnit;
        $der = $subtotalDet;
        $espacioTotal = $ancho - mb_strlen($izq) - mb_strlen($centro) - mb_strlen($der);
        if ($espacioTotal < 2) $espacioTotal = 2;
        $espIzq = intval($espacioTotal / 2);
        $espDer = $espacioTotal - $espIzq;
        $linea2 = $izq . str_repeat(' ', $espIzq) . $centro . str_repeat(' ', $espDer) . $der;
        if (mb_strlen($linea2) > $ancho) $linea2 = mb_substr($linea2, 0, $ancho);
        $ticket .= $linea2 . "\n";
    }

    $ticket .= $lineaPunteada . "\n";

    // Totales
    if ($desgloseIva) {
        $totalNum = floatval($venta['total']);
        $subtSinIva = $totalNum / 1.16;
        $iva = $totalNum - $subtSinIva;
        $ticket .= ajustarColumnas("SUBTOTAL:", 25, 'right') . ajustarColumnas('$' . number_format($subtSinIva, 2), 10, 'right') . "\n";
        if ($venta['descuento'] > 0) {
            $ticket .= ajustarColumnas("DESCUENTO:", 25, 'right') . ajustarColumnas('-$' . number_format($venta['descuento'], 2), 10, 'right') . "\n";
        }
        $ticket .= ajustarColumnas("IVA (16%):", 25, 'right') . ajustarColumnas('$' . number_format($iva, 2), 10, 'right') . "\n";
    } else {
        $ticket .= ajustarColumnas("SUBTOTAL:", 25, 'right') . ajustarColumnas('$' . number_format($venta['subtotal'], 2), 10, 'right') . "\n";
        if ($venta['descuento'] > 0) {
            $ticket .= ajustarColumnas("DESCUENTO:", 25, 'right') . ajustarColumnas('-$' . number_format($venta['descuento'], 2), 10, 'right') . "\n";
        }
        if ($venta['impuesto'] > 0) {
            $ticket .= ajustarColumnas("IMPUESTO:", 25, 'right') . ajustarColumnas('$' . number_format($venta['impuesto'], 2), 10, 'right') . "\n";
        }
    }

    $ticket .= $linea . "\n";
    $ticket .= ajustarColumnas("TOTAL:", 25, 'right', true) . ajustarColumnas('$' . number_format($venta['total'], 2), 10, 'right', true) . "\n";
    $ticket .= $linea . "\n";
    if ($totalEnLetra) {
        $ticket .= numeroALetraPHP(floatval($venta['total'])) . "\n";
    }

    // Observaciones
    if (!empty($venta['observaciones'])) {
        $ticket .= $lineaPunteada . "\n";
        $ticket .= "Observaciones:\n" . wordwrap($venta['observaciones'], $ancho - 2) . "\n";
    }

    // Pie de página
    $ticket .= $linea . "\n";
    $ticket .= centrarTexto("GRACIAS POR SU COMPRA", $ancho) . "\n";
    $ticket .= centrarTexto("¡VUELVA PRONTO!", $ancho) . "\n";
    $ticket .= $linea . "\n";
    $ticket .= "\n\n\n"; // Espacio para corte

    return $ticket;
}

// Función auxiliar para centrar texto
function centrarTexto($texto, $ancho) {
    $len = strlen($texto);
    if ($len >= $ancho) return substr($texto, 0, $ancho);

    $espacios = floor(($ancho - $len) / 2);
    return str_repeat(' ', $espacios) . $texto;
}

// Función auxiliar para ajustar columnas
function ajustarColumnas($texto, $ancho, $alineacion = 'left', $bold = false) {
    $len = strlen($texto);

    if ($len >= $ancho) {
        return substr($texto, 0, $ancho);
    }

    if ($alineacion === 'right') {
        return str_repeat(' ', $ancho - $len) . $texto;
    } else if ($alineacion === 'center') {
        $espacios = floor(($ancho - $len) / 2);
        return str_repeat(' ', $espacios) . $texto . str_repeat(' ', $ancho - $len - $espacios);
    } else {
        return $texto . str_repeat(' ', $ancho - $len);
    }
}

// Función para convertir número a letra en español
if (!function_exists('numeroALetraPHP')) {
    function numeroALetraPHP($num) {
        $unidades = ['', 'UN', 'DOS', 'TRES', 'CUATRO', 'CINCO', 'SEIS', 'SIETE', 'OCHO', 'NUEVE'];
        $especiales = ['DIEZ', 'ONCE', 'DOCE', 'TRECE', 'CATORCE', 'QUINCE'];
        $decenas = ['', 'DIEZ', 'VEINTE', 'TREINTA', 'CUARENTA', 'CINCUENTA', 'SESENTA', 'SETENTA', 'OCHENTA', 'NOVENTA'];
        $centenas = ['', 'CIENTO', 'DOSCIENTOS', 'TRESCIENTOS', 'CUATROCIENTOS', 'QUINIENTOS', 'SEISCIENTOS', 'SETECIENTOS', 'OCHOCIENTOS', 'NOVECIENTOS'];

        $convertirGrupo = function($n) use ($unidades, $especiales, $decenas, $centenas) {
            if ($n == 0) return '';
            if ($n == 100) return 'CIEN';
            $resultado = '';
            if ($n >= 100) { $resultado .= $centenas[intval($n / 100)] . ' '; $n %= 100; }
            if ($n >= 10 && $n <= 15) return $resultado . $especiales[$n - 10];
            if ($n >= 16 && $n <= 19) return $resultado . 'DIECI' . $unidades[$n - 10];
            if ($n >= 21 && $n <= 29) return $resultado . 'VEINTI' . $unidades[$n - 20];
            if ($n >= 10) { $resultado .= $decenas[intval($n / 10)]; $n %= 10; if ($n > 0) $resultado .= ' Y '; }
            $resultado .= $unidades[$n];
            return trim($resultado);
        };

        $entero = intval(floor(abs($num)));
        $centavos = round((abs($num) - $entero) * 100);

        if ($entero == 0) return "CERO PESOS " . str_pad($centavos, 2, '0', STR_PAD_LEFT) . "/100 M.N.";

        $texto = '';
        if ($entero >= 1000000) {
            $millones = intval($entero / 1000000);
            $texto .= ($millones == 1 ? 'UN MILLON' : $convertirGrupo($millones) . ' MILLONES') . ' ';
        }
        $resto = $entero % 1000000;
        if ($resto >= 1000) {
            $miles = intval($resto / 1000);
            $texto .= ($miles == 1 ? 'MIL' : $convertirGrupo($miles) . ' MIL') . ' ';
        }
        $unidad = $resto % 1000;
        if ($unidad > 0) $texto .= $convertirGrupo($unidad);

        return trim($texto) . " PESOS " . str_pad($centavos, 2, '0', STR_PAD_LEFT) . "/100 M.N.";
    }
}

?>
