<?php
Session::init();
$ver = (Session::get('rol') == 1 or Session::get('rol') == 2 or Session::get('rol') == 3 or Session::get('rol') == 5 or Session::get('rol') == 7) ? '' : header('location: ' . URL . 'err/danger');
$ver = (Session::get('bloqueo') == 0 or Session::get('bloqueo') == null) ? '' : header('location: ' . URL . 'err/bloqueo');
?>
<?php
require_once 'public/lib/print/num_letras.php';
require_once 'models/ajuste_model.php';
require_once 'controllers/Notificacion.php';
class Venta extends Controller
{

    function __construct()
    {
        parent::__construct();
    }

    function index()
    {
        $this->view->title_page = 'Punto De Venta';
        $this->view->Salon = $this->model->Salon();
        $this->view->Mozo = $this->model->Mozo();
        $this->view->Repartidor = $this->model->Repartidor();
        $this->view->TipoPago = $this->model->TipoPago();
        $this->view->TipoDocumento = $this->model->TipoDocumento();
        $this->view->js = array('venta/js/jquery-ui.min.js', 'venta/js/venta_index.js', 'venta/js/venta_all.js', 'venta/js/venta_cliente.js');
        $this->view->render('venta/index', false);
        $this->view->TipoDocumento = $this->model->TipoDocumento();
    }

    function mesa_list()
    {
        print_r(json_encode($this->model->mesa_list($_POST)));
    }

    function mostrador_list()
    {
        $this->model->mostrador_list($_POST);
    }

    function mostrador_list_c()
    {
        $this->model->mostrador_list_c($_POST);
    }

    function comensal()
    {
        print_r(json_encode($this->model->comensal()));
    }

    function delivery_list()
    {
        $this->model->delivery_list($_POST);
    }

    function delivery_list_c()
    {
        $this->model->delivery_list_c($_POST);
    }

    function pedidoAccion()
    {
        print_r(json_encode($this->model->pedidoAccion($_POST)));
        $this->notificar($_POST['tipo_pedido']);
    }

    function listarPedidos()
    {
        print_r(json_encode($this->model->listarPedidos($_POST)));
    }

    function listarPedidosDetalle()
    {
        print_r(json_encode($this->model->listarPedidosDetalle($_POST)));
    }

    function listarUpdatePedidos()
    {
        print_r(json_encode($this->model->listarUpdatePedidos($_POST)));
    }

    function reimpresion_comanda()
    {
        print_r(json_encode($this->model->reimpresion_comanda($_POST)));
    }

    function listarComandas()
    {
        print_r(json_encode($this->model->listarComandas($_POST)));
    }

    function listarPedidosTicket()
    {
        print_r(json_encode($this->model->listarPedidosTicket($_POST)));
    }

    function ComboMesaOri()
    {
        $this->model->ComboMesaOri($_POST);
    }

    function ComboMesaDes()
    {
        $this->model->ComboMesaDes($_POST);
    }

    function subPedido()
    {
        print_r(json_encode($this->model->subPedido($_POST)));
    }

    public function cancelarPedido()
    {

        $resp = $this->model->cancelarPedido($_POST);

        if (isset($resp['error'])) {
            header('Content-Type: application/json');
            echo json_encode($resp);
            exit;
        }

        if (isset($resp['productos_cancelados']) && $resp['productos_cancelados'] > 0) {

            $response = [
                'success' => true,
                'message' => "Se cancelaron " . $resp['productos_cancelados'] . " producto(s) correctamente.",
                'data' => $resp
            ];

            $this->notificar($_POST['tipo_pedido']);

        } else {

            $response = [
                'success' => false,
                'message' => "No se canceló ningún producto."
            ];
        }

        header('Content-Type: application/json');
        echo json_encode($response);
        exit;
    }

    public function actualizarDataDelivery()
    {
        // Combinar los datos en uno solo array plano
        $data = $_POST['data'];
        $data['id_pedido'] = $_POST['id_pedido'];

        // Llamar al modelo con la data combinada
        $respuesta = $this->model->actualizarDataDelivery($data);

        // Devolver como JSON
        header('Content-Type: application/json');
        echo json_encode($respuesta);
    }


    function CambiarMesa()
    {
        $row = $this->model->CambiarMesa($_POST);
        if ($row['cod'] == 1) {
            header('location: ' . URL . 'venta');
        } else {
            header('location: ' . URL . 'venta');
        }

        $this->notificar(1);
    }

    function MoverPedidos()
    {
        $row = $this->model->MoverPedidos($_POST);
        if ($row['cod'] == 1) {
            header('location: ' . URL . 'venta');
        } else {
            header('location: ' . URL . 'venta');
        }

        $this->notificar(1);
    }

    function refrescar_mesas()
    {
        $this->model->refrescar_mesas();
        header('location: ' . URL . 'venta');
    }

    // function pedido_create($id){   
    //     $data = $this->model->$id($_POST);
    //     if($data['fil'] == 1){
    //         Session::set('codped', $data['id_pedido']);
    //         //if(Session::get('rol') == 5){
    //         if(Session::get('rol') == 5 && $id == 'pc1'){
    //             print_r(json_encode($data));
    //         } else{
    //             $this->notificar();
    //             header('location: ' . URL . 'venta/orden/'.$data['id_pedido']);
    //         }                     
    //     } else {
    //         if(Session::get('rol') == 5){
    //             print_r(json_encode(0));
    //         } else{
    //             header('location: ' . URL . 'venta');
    //         }            
    //     }        
    // }

    function pedido_create()
    {
        try {
            $method = $_POST['codtipoped'];
            $pedido = $_POST['pedido'];
            $detalle = $_POST['detalle'];


            if ($detalle['cod_ped'] == 0) {
                $data = $this->model->$method($pedido);

                if ($data['fil'] != 1) {
                    echo json_encode([
                        'status' => 'error',
                        'message' => $data
                    ]);
                    exit;
                }
                $detalle['cod_ped'] = $data['id_pedido'];
            }

            $validar = $this->model->ValidarEstadoPedido($detalle['cod_ped']);
            if ($validar['cod'] != 1) {
                echo json_encode([
                    'status' => 'error',
                    'message' => 'El pedido no está en estado válido para su registro.'
                ]);
                exit;
            }

            $canal = isset($_POST['canal']) ? $_POST['canal'] : 'web';

            $resp = $this->model->RegistrarPedido($detalle);
            $this->notificar($detalle['codtipoped'], $canal);

            echo json_encode($resp);
            exit;

        } catch (Exception $e) {
            echo json_encode([
                'status' => 'error',
                'message' => 'Error en el proceso de pedido.',
                'error' => $e->getMessage()
            ]);
            exit;
        }
    }


    function orden($id_pedido)
    {
        $this->view->title_page = 'Pedido N° ' . $id_pedido;
        $this->view->TipoDocumento = $this->model->TipoDocumento();

        $ajuste = new Ajuste_Model();
        $this->view->Invoice = $ajuste->limit('invoices');

        $this->view->TipoPago = $this->model->TipoPago();
        $data = $this->model->ValidarEstadoPedido($id_pedido);
        if ($data['cod'] == 1) {
            $this->view->js = array('venta/js/jquery-ui.min.js', 'venta/js/js-render.js', 'venta/js/venta_orden.js', 'venta/js/venta_all.js', 'venta/js/venta_cliente.js');
            Session::set('codped', $id_pedido);
            Session::set('codtipoped', $data['tipo_pedido']);
            $this->view->render('venta/orden', false);
        } else {
            header('location: ' . URL . 'venta');
        }
    }

    function RegistrarPedido()
    {
        $data = $this->model->ValidarEstadoPedido($_POST['cod_ped']);
        if ($data['cod'] == 1) {
            $this->model->RegistrarPedido($_POST);
            print_r(json_encode(1));
        } else {
            print_r(json_encode(2));
        }

        $this->notificar(1);
    }

    /* validad que el pedido siga activo  */
    function ValidarEstadoPedido()
    {
        $data = $this->model->ValidarEstadoPedido($_POST['cod_ped']);
        if ($data['cod'] == 1) {
            print_r(json_encode(1));
        } else {
            print_r(json_encode(2));
        }
    }


    function RegistrarVenta(){
        if($_POST['id_pedido'] != ''){
            $id_venta = $this->model->RegistrarVenta($_POST);
            print_r(json_encode($id_venta));
            if(Session::get('sunat') == 1){
                if(Session::get('envios_auto') == 1){
                    if($_POST['tipo_doc'] <> 3){
                        // require_once 'api_fact/controller/api.php';
                        // $invoice = new ApiSunat();
                        // $data = $invoice->sendDocSunaht($id_venta,2);

                        // require_once 'controllers/PseController.php';
                        // $pse = new PseController();
                        // $resp = $pse->enviarFactura($id_venta);
                    }
                }

            }

            $this->notificar($_POST['tipo_pedido']);
        }
    }

    // function RegistrarVenta()
    // {
    //     // 0) Validación mínima
    //     if (empty($_POST['id_pedido'])) {
    //         header('Content-Type: application/json; charset=utf-8');
    //         http_response_code(400);
    //         echo json_encode(['ok' => false, 'error' => 'Falta id_pedido'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    //         return;
    //     }

    //     try {
    //         // 1) Registrar venta
    //         $id_venta = $this->model->RegistrarVenta($_POST);

    //         // 2) Respuesta principal (DEJAR TAL CUAL)
    //         header('Content-Type: application/json; charset=utf-8');
    //         print_r(json_encode($id_venta));

    //         // (opcional) empuja el buffer pero NO cerramos la respuesta
    //         @ob_flush();
    //         @flush();

    //         // 3) Envío a la API: SOLO si cumplen tus validaciones
    //         //    *** MODIFICADO: no imprime NADA al front; solo hace logs ***
    //         if (
    //             (int) (Session::get('sunat') ?? 0) === 1 &&
    //             (int) (Session::get('envios_auto') ?? 0) === 1 &&
    //             (int) ($_POST['tipo_doc'] ?? 0) !== 3   // ajusta si también quieres enviar boleta aquí
    //         ) {
    //             require_once 'controllers/PseController.php';
    //             $pse = new PseController();

    //             try {
    //                 $resp = $pse->enviarFactura((int) $id_venta);

    //                 // No imprimimos nada, solo logueamos si hubo problema
    //                 if (!is_array($resp) || empty($resp['ok'])) {
    //                     $msg = is_array($resp)
    //                         ? ($resp['message'] ?? $resp['error'] ?? 'Error al enviar el comprobante')
    //                         : 'Respuesta inválida de enviarFactura';
    //                     $http = is_array($resp) ? ($resp['http'] ?? 0) : 0;

    //                     // Log interno
    //                     error_log(sprintf(
    //                         "[RegistrarVenta][enviarFactura] id_venta=%s http=%s msg=%s",
    //                         $id_venta,
    //                         $http,
    //                         $msg
    //                     ));

    //                     // Si quieres distinguir el 1032 en logs:
    //                     if (is_array($resp) && ($resp['code'] ?? '') === 'SUNAT_1032') {
    //                         $cbc = $resp['cbc_id'] ?? 'desconocido';
    //                         error_log("[RegistrarVenta][enviarFactura] SUNAT_1032 cbc_id={$cbc}");
    //                     }
    //                 }

    //             } catch (\Throwable $e) {
    //                 // Tampoco imprimimos al front; solo logueamos
    //                 error_log("[RegistrarVenta][enviarFactura][ex] id_venta={$id_venta} error=" . $e->getMessage());
    //             }
    //         }

    //         // 4) Notificar (flujo normal)
    //         $this->notificar($_POST['tipo_pedido'] ?? null);

    //     } catch (\Throwable $e) {
    //         // Si falló ANTES de imprimir el id_venta
    //         if (!headers_sent()) {
    //             header('Content-Type: application/json; charset=utf-8');
    //         }
    //         http_response_code(500);
    //         echo json_encode(['ok' => false, 'error' => $e->getMessage()], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    //     }
    // }

    function TestVenta()
    {


        require_once 'controllers/PseController.php';
        $pse = new PseController();
        $resp = $pse->enviarFactura($_POST['id_venta']);
        header('Content-Type: application/json');
        echo json_encode($resp);

    }

    function anular_pedido()
    {
        $this->notificar($_POST['tipo_pedido']);
        print_r(json_encode($this->model->anular_pedido($_POST)));
    }

    function anular_venta()
    {
        try {
            $response = $this->model->anular_venta($_POST);

            // Si el modelo no retorna nada, crear respuesta por defecto
            if ($response === null) {
                $response = ['success' => true, 'message' => 'Venta anulada correctamente'];
            }

            header('Content-Type: application/json');
            echo json_encode($response);

        } catch (Exception $e) {
            header('Content-Type: application/json');
            echo json_encode(['success' => false, 'message' => 'Error interno del servidor']);
        }
    }

    function defaultdata()
    {
        print_r(json_encode($this->model->defaultdata($_POST)));
    }

    function listarCategorias()
    {
        print_r(json_encode($this->model->listarCategorias($_POST)));
    }

    function listarProdsMasVend()
    {
        print_r(json_encode($this->model->listarProdsMasVend($_POST)));
    }

    function listarProductos()
    {
        print_r(json_encode($this->model->listarProductos($_POST)));
    }

    function buscar_producto()
    {
        print_r(json_encode($this->model->buscar_producto($_POST)));
    }

    function ListarDetallePed()
    {
        print_r(json_encode($this->model->ListarDetallePed($_POST)));
    }

    function cliente_crud()
    {
        if ($_POST['id_cliente'] != '') {
            print_r(json_encode($this->model->cliente_crud_update($_POST)));
        } else {
            print_r(json_encode($this->model->cliente_crud_create($_POST)));
        }
    }

    function buscar_cliente()
    {
        print_r(json_encode($this->model->buscar_cliente(API_TOKEN, $_POST)));
    }

    function buscar_cliente_telefono()
    {
        print_r(json_encode($this->model->buscar_cliente_telefono($_POST)));
    }

    function pedido_edit()
    {
        $this->model->pedido_edit($_POST);
    }

    function pedido_crud()
    {
        print_r(json_encode($this->model->pedido_crud_update($_POST)));
    }

    function pedido_delete()
    {
        $this->model->pedido_delete($_POST);
        $this->notificar($_POST['tipo_pedido']);
    }

    function venta_edit()
    {
        $this->model->venta_edit($_POST);
    }

    function venta_edit_pago()
    {
        print_r(json_encode($this->model->venta_edit_pago($_POST)));
    }

    function venta_edit_documento()
    {
        print_r(json_encode($this->model->venta_edit_documento($_POST)));
        if (Session::get('sunat') == 1) {
            if ($_POST['id_tipo_documento'] <> 3) {
                require_once 'api_fact/controller/api.php';
                $invoice = new ApiSunat();
                $data = $invoice->sendDocSunaht($_POST['id_venta'], 2);
            }
        }
    }

    function tags_list()
    {
        print_r(json_encode($this->model->tags_list($_POST)));
    }

    function tags_crud()
    {
        print_r(json_encode($this->model->tags_crud($_POST)));
    }

    /* INICIO COMPROBANTE SIN ENVIAR SUNAT */

    function contadorSunatSinEnviar()
    {
        print_r(json_encode($this->model->contadorSunatSinEnviar()));
    }

    /* FIN COMPROBANTE SIN ENVIAR SUNAT */

    /* INICIO PEDIDOS PREPARADOS */

    function contadorPedidosPreparados()
    {
        print_r(json_encode($this->model->contadorPedidosPreparados()));
    }

    function listarPedidosPreparados()
    {
        $this->model->listarPedidosPreparados();
    }

    function pedidoEntregado()
    {
        print_r(json_encode($this->model->pedidoEntregado($_POST)));
    }

    function pedido_estado_update()
    {
        print_r(json_encode($this->model->pedido_estado_update($_POST)));
    }

    function menu_categoria_list()
    {
        $this->model->menu_categoria_list($_POST);
    }

    function menu_plato_list()
    {
        $this->model->menu_plato_list($_POST);
    }

    function menu_plato_estado()
    {
        print_r(json_encode($this->model->menu_plato_estado($_POST)));
    }

    function impresion_precuenta($id_pedido)
    {
        if (Session::get('print_pre') == 1) {
            $dato = $this->model->impresion_precuenta($id_pedido);
            header('location: http://' . Session::get('pc_ip') . '/imprimir/pre_cuenta.php?data=' . urlencode(json_encode($dato)));
        } else {
            $this->view->dato = $this->model->impresion_precuenta($id_pedido);
            $this->view->render('venta/imprimir/precuenta', true);
        }
    }
    // pdf reparto 
    function impresion_reparto($id_venta)
    {
        if (Session::get('print_cpe') == 1) {
            $dato = $this->model->impresion_reparto($id_venta);
            header('location: http://' . Session::get('pc_ip') . '/imprimir/ticket_reparto.php?data=' . json_encode($dato));
        } else {
            $this->view->dato = $this->model->impresion_reparto($id_venta);
            $this->view->render('venta/imprimir/ticketreparto', true);
        }
    }

    function impresion_reparto_pedido($id_pedido)
    {
        if (Session::get('print_cpe') == 1) {
            $dato = $this->model->impresion_reparto_pedido($id_pedido);
            header('location: http://' . Session::get('pc_ip') . '/imprimir/ticket_reparto.php?data=' . json_encode($dato));
        } else {
            $this->view->dato = $this->model->impresion_reparto_pedido($id_pedido);
            $this->view->render('venta/imprimir/ticketreparto', true);
        }
    }

    function impresion_comanda()
    {
        $this->view->render('venta/imprimir/comanda', true);
    }


    function contador_comanda()
    {
        print_r(json_encode($this->model->contador_comanda($_POST)));
    }

    function Personal()
    {
        print_r(json_encode($this->model->Personal()));
    }

    function alert_pedidos_programados()
    {
        print_r(json_encode($this->model->alert_pedidos_programados()));
    }

    /* FIN PEDIDOS PREPARADOS */
    function control_stock_pedido()
    {
        print_r(json_encode($this->model->control_stock_pedido($_POST)));
    }

    function notificar($tipo_pedido, $canal = "web")
    {

        //echo "Notificando tipo_pedido: $tipo_pedido, canal: $canal\n"; // Línea de depuración

        $notifier = new Notificacion();
        try {

            if ($tipo_pedido == 1) {
                $notifier->enviarNotificacion();
            } elseif ($tipo_pedido == 2 && $canal != 'venta_rapida') {
                $notifier->enviarNotificacionMostrador();
            } elseif ($tipo_pedido == 3) {
                $notifier->enviarNotificacionDelivery();
            }elseif ($tipo_pedido == 2 && $canal = 'venta_rapida') {
                $notifier->enviarNotificacionVentaRapida();
            }

        } catch (\Exception $e) {
            echo "Error al notificar: " . $e->getMessage();
        }
    }


}