<?php
/**
 * Archivo para imprimir comandas desde app móvil
 * Recibe datos vía POST y los distribuye a las impresoras según cocina
 * Usa librería: mike42/escpos-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");
header('Content-Type: application/json; charset=utf-8');

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;

// Recibir datos
$dataPrint = null;

if(isset($_POST["dataPrint"])){
    if(is_string($_POST["dataPrint"])){
        $dataPrint = json_decode($_POST["dataPrint"], true);
    } else {
        $dataPrint = $_POST["dataPrint"];
    }
}

if(!$dataPrint){
    echo json_encode(['success' => false, 'status' => 'error', 'message' => 'No se recibieron datos para imprimir', 'errores' => []]);
    exit;
}

if (!isset($dataPrint['impresos']) || empty($dataPrint['impresos'])) {
    echo json_encode(['success' => false, 'status' => 'error', 'message' => 'No hay comandas para imprimir', 'errores' => []]);
    exit;
}

$impresos = $dataPrint['impresos'];
$errores = array();
$exitos = array();

// Iterar sobre cada impresora/cocina
foreach ($impresos as $nombreImpresora => $datosComanda) {
    try {
        // Crear connector según el nombre de la impresora
        $connector = new WindowsPrintConnector($nombreImpresora);
        $printer = new Printer($connector);
        
        // ENCABEZADO
        $printer->setJustification(Printer::JUSTIFY_CENTER);
        $printer->setTextSize(2, 2);
        $printer->text($datosComanda['cocina'] . "\n");
        $printer->setTextSize(1, 1);
        $printer->text(str_repeat("=", 45) . "\n");
        $printer->setEmphasis(true);
        $printer->text("ORDEN #" . (isset($datosComanda['num_orden']) ? $datosComanda['num_orden'] : $datosComanda['id_orden']) . "\n");
        $printer->setEmphasis(false);
        $printer->text(str_repeat("=", 45) . "\n");
        
        // INFORMACIÓN DE LA ORDEN
        $printer->setJustification(Printer::JUSTIFY_LEFT);
        $printer->setEmphasis(true);
        $printer->text("Fecha: ");
        $printer->setEmphasis(false);
        $printer->text(date('d/m/Y H:i', strtotime($datosComanda['fecha'])) . "\n");
        
        
        $printer->setEmphasis(true);
        $printer->text("Mesa: ");
        $printer->setEmphasis(false);
        $printer->text($datosComanda['mesa'] . "\n");
        
        /*
        $printer->setEmphasis(true);
        $printer->text("Mesero: ");
        $printer->setEmphasis(false);
        $printer->text($datosComanda['mesero'] . "\n");
        
        $printer->setEmphasis(true);
        $printer->text("Cliente: ");
        $printer->setEmphasis(false);
        $printer->text($datosComanda['cliente'] . "\n");*/
        
        $printer->setEmphasis(true);
        $printer->text("Servicio: ");
        $printer->setEmphasis(false);
        $printer->text($datosComanda['servicio'] . "\n");
        
        $printer->text(str_repeat("-", 45) . "\n");
        
        // PLATOS
        $printer->setEmphasis(true);
        $printer->text("PLATOS:\n");
        $printer->setEmphasis(false);
        $printer->text(str_repeat("-", 45) . "\n");
        
        foreach ($datosComanda['platos'] as $plato) {
            // $plato es un array con [cant, nombre, acompanamientos, notas]
            $cant = $plato[0];
            $nombre = $plato[1];
            $acompanamientos = isset($plato[2]) ? $plato[2] : '';
            $notas = isset($plato[3]) ? $plato[3] : '';
            
            // Cantidad y nombre del plato
            $printer->setEmphasis(true);
            $printer->setTextSize(1, 1);
            $printer->text(number_format($cant, 0) . "x " . $nombre . "\n");
            $printer->setEmphasis(false);
            
            // Acompañamientos
            if (!empty($acompanamientos)) {
                $printer->text("   " . $acompanamientos . "\n");
            }
            
            // Notas del plato
            if (!empty($notas)) {
                $printer->text("   Notas: " . $notas . "\n");
            }
            
            $printer->text("\n");
        }
        
        $printer->text(str_repeat("=", 45) . "\n");
        
        // NOTAS GENERALES DE LA ORDEN
        if (!empty($datosComanda['notas'])) {
            $printer->text("\n");
            $printer->setEmphasis(true);
            $printer->setTextSize(1, 1);
            $printer->text("*** NOTAS ***\n");
            $printer->setTextSize(1, 1);
            $printer->setEmphasis(false);
            $printer->text($datosComanda['notas'] . "\n");
            $printer->text(str_repeat("=", 45) . "\n");
        }
        
        $printer->feed(3);
        $printer->cut();
        $printer->close();
        
        $exitos[] = $nombreImpresora . " (" . $datosComanda['cocina'] . ")";
        
    } catch (Exception $e) {
        $errores[] = array(
            'impresora' => $nombreImpresora,
            'cocina' => isset($datosComanda['cocina']) ? $datosComanda['cocina'] : 'N/A',
            'error' => $e->getMessage()
        );
    }
}

// Respuesta
$response = array(
    'success' => count($errores) == 0,
    'status' => count($errores) == 0 ? 'success' : 'partial',
    'exitos' => $exitos,
    'errores' => $errores,
    'total_impresos' => count($impresos),
    'total_exitos' => count($exitos),
    'total_errores' => count($errores),
    'message' => count($errores) == 0 
        ? 'Todas las comandas se imprimieron correctamente' 
        : 'Algunas comandas no se pudieron imprimir'
);

echo json_encode($response);
