<?php
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    header("Access-Control-Allow-Origin: *");
    header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
    header("Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With");
    http_response_code(204);
    exit;
}

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");
header("Access-Control-Allow-Headers: Content-Type, Authorization");

error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', 'logs/error.log');

require __DIR__ . '/vendor/autoload.php';
use Mike42\Escpos\Printer;
use Mike42\Escpos\PrintConnectors\WindowsPrintConnector;
use Mike42\Escpos\EscposImage;

// Recibir datos - puede venir como JSON string o como objeto serializado por jQuery
$dataComanda = null;

if(isset($_POST["dataComanda"])){
    if(is_string($_POST["dataComanda"])){
        $dataComanda = json_decode($_POST["dataComanda"]);
    } else {
        $dataComanda = json_decode(json_encode($_POST["dataComanda"]));
    }
} elseif(isset($_POST["dataPrint"])){
    if(is_string($_POST["dataPrint"])){
        $dataComanda = json_decode($_POST["dataPrint"]);
    } else {
        $dataComanda = json_decode(json_encode($_POST["dataPrint"]));
    }
}

if($dataComanda){
    // Verificar si tiene productos_cocina ya generados
    if(isset($dataComanda->productos_cocina) && is_array($dataComanda->productos_cocina) && count($dataComanda->productos_cocina) > 0){
        $productosPorCocina = $dataComanda->productos_cocina;
    } else {
        // Si no tiene productos_cocina, retornar error silencioso (no hay nada que imprimir en cocina)
        echo json_encode(array('status' => 'success', 'message' => 'No hay productos para cocina'));
        exit;
    }
    
    // Datos generales
    $fecha = $dataComanda->fecha ?? date("d-m-Y H:i:s");
    $numeroOrden = $dataComanda->numero_orden ?? ($dataComanda->referencia ?? "N/A");
    
    // Extraer número de orden si viene con formato V-, C-, D-
    if(isset($numeroOrden) && is_string($numeroOrden)){
        $numeroOrden = str_replace(array("V-", "C-", "D-"), "", $numeroOrden);
    }
    
    $mesa = $dataComanda->mesa_orden ?? ($dataComanda->mesa ?? "N/A");
    $mesero = $dataComanda->mesero ?? ($dataComanda->vendedor ?? "");
    $cliente = $dataComanda->cliente ?? "";
    $servicio = $dataComanda->servicio ?? "";
    $notas = $dataComanda->notas ?? "";
    $observaciones = $dataComanda->observaciones ?? "";
    
    $resultados = [];
    
    // Imprimir una comanda por cada cocina
    foreach ($productosPorCocina as $cocina) {
        try {
            $PRINTER_NAME = $cocina->impresor;
            $anchoPapel = intval($cocina->ancho_papel ?? 80);
            $maxCaracteres = ($anchoPapel == 80) ? 45 : 32; // Caracteres según ancho de papel
            $maxDescripcion = ($anchoPapel == 80) ? 28 : 20;
            
            $connector = new WindowsPrintConnector($PRINTER_NAME);
            $printer = new Printer($connector);
            
            // ENCABEZADO
            $printer->setJustification(Printer::JUSTIFY_CENTER);
            $printer->setTextSize(2, 2);
            $printer->text("COMANDA\n");
            $printer->setTextSize(1, 1);
            $printer->text(strtoupper($cocina->nombre_cocina) . "\n");
            $printer->text(str_repeat("=", $maxCaracteres) . "\n");
            
            // INFORMACIÓN DE LA ORDEN
            $printer->setJustification(Printer::JUSTIFY_LEFT);
            $printer->setEmphasis(true);
            $printer->text("Fecha: ");
            $printer->setEmphasis(false);
            $printer->text("$fecha\n");
            
            $printer->setEmphasis(true);
            $printer->text("Orden: ");
            $printer->setEmphasis(false);
            $printer->text("$numeroOrden");
            
            $printer->setEmphasis(true);
            $printer->text("  Mesa: ");
            $printer->setEmphasis(false);
            $printer->text("$mesa\n");
            
            if($mesero && $mesero != ""){
                $printer->setEmphasis(true);
                $printer->text("Mesero: ");
                $printer->setEmphasis(false);
                $printer->text("$mesero\n");
            }
            
            if($cliente && $cliente != ""){
                $printer->setEmphasis(true);
                $printer->text("Cliente: ");
                $printer->setEmphasis(false);
                $printer->text("$cliente\n");
            }
            
            if($servicio && $servicio != ""){
                $printer->setEmphasis(true);
                $printer->text("Servicio: ");
                $printer->setEmphasis(false);
                $printer->text("$servicio\n");
            }
            
            $printer->text(str_repeat("-", $maxCaracteres) . "\n");
            
            // PRODUCTOS
            $printer->setEmphasis(true);
            $printer->setTextSize(1, 1);
            $printer->text("Cant  Descripcion\n");
            $printer->setEmphasis(false);
            $printer->text(str_repeat("-", $maxCaracteres) . "\n");
            
            foreach ($cocina->productos as $producto) {
                // Formatear cantidad
                $cantidad = str_pad(number_format($producto->cant, 2), 6, " ", STR_PAD_RIGHT);
                
                // Descripción del producto
                $descripcion = $producto->desc;
                $descripcionLineas = explode("\n", wordwrap($descripcion, $maxDescripcion, "\n", true));
                
                // Primera línea con cantidad
                $printer->setTextSize(1, 1);
                $printer->text("$cantidad " . $descripcionLineas[0] . "\n");
                
                // Líneas adicionales de descripción
                for ($i = 1; $i < count($descripcionLineas); $i++) {
                    $printer->text("      " . $descripcionLineas[$i] . "\n");
                }
                
                // Acompañamientos si existen
                if (isset($producto->acompanamientos) && $producto->acompanamientos != "") {
                    $printer->setEmphasis(true);
                    $printer->text("      CON: ");
                    $printer->setEmphasis(false);
                    $printer->text($producto->acompanamientos . "\n");
                }

                // Notas del producto si existen
                if (isset($producto->notas) && $producto->notas != "") {
                    $printer->setEmphasis(true);
                    $printer->text("      NOTA: ");
                    $printer->setEmphasis(false);
                    $notasLineas = explode("\n", wordwrap($producto->notas, $maxDescripcion - 6, "\n", true));
                    $printer->text($notasLineas[0] . "\n");
                    for ($j = 1; $j < count($notasLineas); $j++) {
                        $printer->text("            " . $notasLineas[$j] . "\n");
                    }
                }
                
                $printer->text("\n");
            }
            
            $printer->text(str_repeat("=", $maxCaracteres) . "\n");
            
            // NOTAS GENERALES
            if($notas && $notas != ""){
                $printer->setEmphasis(true);
                $printer->text("NOTAS:\n");
                $printer->setEmphasis(false);
                $notasLineas = explode("\n", wordwrap($notas, $maxCaracteres, "\n", true));
                foreach($notasLineas as $linea){
                    $printer->text($linea . "\n");
                }
                $printer->text("\n");
            }
            
            if($observaciones && $observaciones != ""){
                $printer->setEmphasis(true);
                $printer->text("OBSERVACIONES:\n");
                $printer->setEmphasis(false);
                $obsLineas = explode("\n", wordwrap($observaciones, $maxCaracteres, "\n", true));
                foreach($obsLineas as $linea){
                    $printer->text($linea . "\n");
                }
                $printer->text("\n");
            }
            
            // PIE
            $printer->setJustification(Printer::JUSTIFY_CENTER);
            $printer->setTextSize(2, 2);
            $printer->text("PREPARAR\n");
            $printer->setTextSize(1, 1);
            $printer->text("Orden: $numeroOrden\n");
            
            // CORTAR PAPEL Y CERRAR IMPRESORA
            $printer->feed(3);
            $printer->cut();
            $printer->close();
            
            $resultados[] = [
                "cocina" => $cocina->nombre_cocina,
                "impresora" => $PRINTER_NAME,
                "status" => "success",
                "message" => "Comanda impresa correctamente"
            ];
            
        } catch (Exception $e) {
            $resultados[] = [
                "cocina" => $cocina->nombre_cocina ?? "Desconocida",
                "impresora" => $PRINTER_NAME ?? "Desconocida",
                "status" => "error",
                "message" => "Error al imprimir: " . $e->getMessage()
            ];
        }
    }
    
    // Verificar si todas las impresiones fueron exitosas
    $todosExitosos = true;
    foreach($resultados as $resultado){
        if($resultado["status"] != "success"){
            $todosExitosos = false;
            break;
        }
    }
    
    echo json_encode([
        "status" => $todosExitosos ? "success" : "partial",
        "message" => $todosExitosos ? "Todas las comandas impresas correctamente" : "Algunas comandas no se pudieron imprimir",
        "resultados" => $resultados
    ]);
    
} else {
    echo json_encode([
        "status" => "error",
        "message" => "No se recibieron datos para imprimir comandas."
    ]);
}
?>
