<?php
Session::init();
$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 'mailer/send.php';

class Facturacion extends Controller
{

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

    function Index()
    {
        $this->view->title_page = 'Facturación Electrónica';
        $this->view->js = array('venta/js/jquery-ui.min.js', 'facturacion/js/facturacion.js');
        $this->view->render('facturacion/index', false);
    }

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

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

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

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

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

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

    // function Invoice()
    // {
    //     // $cod_ven = $_POST['cod_ven'];
    //     // $invoice = new ApiSunat();
    //     // $data = $invoice->sendDocSunaht($cod_ven, 1);
    //     // var_dump($data);

    //     require_once 'controllers/PseController.php';
    //     $pse = new PseController();
    //     $resp = $pse->enviarFactura((int) $_POST['cod_ven']);
    //     var_dump($resp);
    // }

    // function ComunicacionBaja(){
       
    //     $api = new ApiSunat();
    //     $api->postComunicacionBaja($_POST);
    // }


    function Invoice()
    {
        header('Content-Type: application/json; charset=UTF-8');
        // (Opcional CORS)
        // header('Access-Control-Allow-Origin: *');
        // header('Access-Control-Allow-Methods: POST, OPTIONS');
        // if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(204); exit; }

        try {
            if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
                http_response_code(405);
                echo json_encode(['ok' => false, 'message' => 'Método no permitido']);
                return;
            }

            $codVen = filter_input(INPUT_POST, 'cod_ven', FILTER_VALIDATE_INT);
            if (!$codVen) {
                http_response_code(422);
                echo json_encode(['ok' => false, 'message' => 'cod_ven es requerido y debe ser entero']);
                return;
            }

            $tipo_doc = filter_input(INPUT_POST, 'tipo_doc', FILTER_VALIDATE_INT);
            if (!$tipo_doc) {
                http_response_code(422);
                echo json_encode(['ok' => false, 'message' => 'tipo_doc es requerido y debe ser entero']);
                return;
            }

            require_once 'controllers/PseController.php';
            $pse = new PseController();

            $resp = $tipo_doc == 1 ? $pse->resumenBoleta((int) $codVen, 1) :  $pse->enviarFactura((int) $codVen);

            // Si tu enviarFactura() ya devuelve ['ok'=>bool,'http'=>int,...]
            $isOk = !empty($resp['ok']);
            $status = (int) ($resp['http'] ?? ($isOk ? 200 : 500));

            // Normaliza códigos de error del PSE hacia 4xx/5xx
            if (!$isOk && ($status < 400 || $status > 599)) {
                $status = 400;
            }
            http_response_code($status);

            if ($isOk) {
                // Payload compacto para el front
                echo json_encode([
                    'ok' => true,
                    'message' => $resp['mensaje'] ?? 'Emitido correctamente',
                    'hash_cpe' => $resp['hash_cpe'] ?? null,
                    'hash_cdr' => $resp['hash_cdr'] ?? null,
                    'files' => [
                        'zip_cpe_url' => $resp['zip_cpe_url'] ?? null,
                        'zip_cdr_url' => $resp['zip_cdr_url'] ?? null,
                        'zip_cpe_local' => $resp['zip_cpe_local'] ?? null, // por si tu front es interno
                        'zip_cdr_local' => $resp['zip_cdr_local'] ?? null,
                    ],
                    'rutas_api' => $resp['rutas_api'] ?? null, // ruta_xml, ruta_pdf, etc. si las expone el PSE
                ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
            } else {
                // No expongas demasiada info en prod; deja 'debug' para staging
                echo json_encode([
                    'ok' => false,
                    'message' => $resp['mensaje']
                        ?? $resp['message']
                        ?? $resp['error']
                        ?? ($resp['response_json']['mensaje'] ?? 'Error al emitir'),
                    'http' => $status,
                    'debug' => [
                        'request' => $resp['request_json'] ?? null,
                        'response' => $resp['response_raw'] ?? null,
                    ],
                ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
            }

        } catch (Throwable $e) {
            http_response_code(500);
            echo json_encode(['ok' => false, 'message' => $e->getMessage()]);
        }
    }
    
    function ComunicacionBaja()
    {
        require_once 'controllers/PseController.php';

        // Siempre responde JSON
        header('Content-Type: application/json; charset=utf-8');

        try {
                        
            // Validar método y payload
            if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
                http_response_code(405); // Method Not Allowed
                echo json_encode(['ok' => false, 'error' => 'Método no permitido']);
                return;
            }

            $post = $_POST ?? [];
            
            if (empty($post) || !isset($post['id_venta'])) {
                http_response_code(400);
                echo json_encode(['ok' => false, 'error' => 'Faltan parámetros (id_venta)']);
                return;
            }

            $id_venta = (int) $post['id_venta'];
            if ($id_venta <= 0) {
                http_response_code(400);
                echo json_encode(['ok' => false, 'error' => 'id_venta inválido']);
                return;
            }

            $pse = new PseController();

            $resp = $post['tipo_doc'] == "1" ? $pse->comunicacionBaja($id_venta) : $pse->resumenBoleta($id_venta, 3);

            if (!is_array($resp)) {
                // Defensa: si por alguna razón no vuelve array
                http_response_code(500);
                echo json_encode(['ok' => false, 'error' => 'Respuesta interna inválida']);
                return;
            }

            if (!empty($resp['ok'])) {
                // Éxito
                
                // 1. Reposición de Stock SÍNCRONA (para asegurar que termine)
                // Ya arreglamos reponerStockVenta para que sea silencioso con false.
                $stockResult = [];
                try {
                     $stockResult = $pse->reponerStockVenta($id_venta, false);
                     
                     // 1.1 Notificar a Pusher si hubo cambios en stock
                     if (!empty($stockResult['ok'])) {
                        require_once 'controllers/Notificacion.php';
                        $noti = new Notificacion();
                        $noti->enviarNotificacion();
                        // stock-update global: todos los terminales actualizan su stock
                        $noti->notificarReposicionStock(['timestamp' => time(), 'canal' => 'facturacion']);
                     }

                } catch (\Throwable $ex) {
                    $stockResult = ['ok' => false, 'message' => $ex->getMessage()];
                    error_log("Error critical reponerStockVenta: " . $ex->getMessage());
                }

                // 2. Preparar Respuesta Final
                $responseBody = [
                    'ok' => true,
                    'http' => $resp['http'] ?? 200,
                    'ticket' => $resp['ticket'] ?? null, 
                    'cod_sunat' => $resp['cod_sunat'] ?? null,
                    'mensaje' => $resp['mensaje'] ?? null,
                    'hash_cpe' => $resp['hash_cpe'] ?? null,
                    'hash_cdr' => $resp['hash_cdr'] ?? null,
                    // Rutas
                    'zip_cpe_url' => $resp['zip_cpe_url'] ?? null,
                    'zip_cdr_url' => $resp['zip_cdr_url'] ?? null,
                    // Info de stock (opcional, útil para debug)
                    'stock_info' => $stockResult
                ];

                // 3. Enviar respuesta normal
                http_response_code(200);
                header('Content-Type: application/json; charset=utf-8');
                echo json_encode($responseBody, JSON_UNESCAPED_UNICODE);
                return;
            }

            // Error controlado desde el servicio
            http_response_code(400);
            echo json_encode([
                'ok' => false,
                'error' => $resp['error'] ?? $resp['message'] ?? 'Error desconocido'
            ], JSON_UNESCAPED_UNICODE);

        } catch (\Throwable $e) {
            http_response_code(500);
            echo json_encode(['ok' => false, 'error' => $e->getMessage()], JSON_UNESCAPED_UNICODE);
        }
    }
    // function ComunicacionBaja()
    // {
    //     require_once 'controllers/PseController.php';
    //     $pse = new PseController();
    //     $post = $_POST ?? [];
    //     if (empty($post) || !isset($post['id_venta'])) {
    //         http_response_code(400);
    //         echo json_encode(['ok' => false, 'error' => 'Faltan parámetros (id_venta)']);
    //         return;
    //     }

    //     $id_venta = (int) $post['id_venta'];
    //     if ($id_venta <= 0) {
    //         http_response_code(400);
    //         echo json_encode(['ok' => false, 'error' => 'id_venta inválido']);
    //         return;
    //     }

    //     $pse = new PseController();
    //     $resp = $pse->comunicacionBaja($id_venta);
    //     var_dump($resp);
    // }


    function reenvio()
    {
        $this->model->reenvio($_POST);

        // Si se cambia a estado ANULADO (11), reponer stock y notificar
        if (isset($_POST['estado']) && $_POST['estado'] == '11' && !empty($_POST['cod_ven'])) {
            require_once 'controllers/PseController.php';
            $pse = new PseController();
            try {
                // false = modo anulación (devuelve stock)
                $stockResult = $pse->reponerStockVenta((int)$_POST['cod_ven'], false);
                
                if (!empty($stockResult['ok'])) {
                    require_once 'controllers/Notificacion.php';
                    $noti = new Notificacion();
                    $noti->notificarReposicionStock($stockResult);
                }
            } catch (\Throwable $th) {
                error_log("Error reenvio stock replenishment: " . $th->getMessage());
            }
        }

        print_r(json_encode(1));
    }

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

    function Resumen_boletas()
    {
        header('Content-Type: application/json; charset=utf-8');

        try {
            $fechaInput = $_POST['fecha'] ?? '';
            $fechaTime = strtotime((string) $fechaInput);

            if (!$fechaInput || $fechaTime === false) {
                echo json_encode([
                    'enviado_sunat' => '0',
                    'mensaje' => 'La fecha es obligatoria'
                ]);
                return;
            }

            $fecha = date('Y-m-d', $fechaTime);
            $boletasPendientes = $this->model->listarBoletasPendientesPorFecha($fecha);

            if (empty($boletasPendientes)) {
                echo json_encode([
                    'enviado_sunat' => '0',
                    'mensaje' => 'No existe boletas pendientes en la fecha consultada'
                ]);
                return;
            }

            require_once 'controllers/PseController.php';
            $pse = new PseController();

            $total = count($boletasPendientes);
            $enviadas = 0;
            $errores = [];

            foreach ($boletasPendientes as $row) {
                $idVenta = (int) ($row['id_venta'] ?? 0);
                if ($idVenta <= 0) {
                    continue;
                }

                $resp = $pse->resumenBoleta($idVenta, 1);
                if (is_array($resp) && !empty($resp['ok'])) {
                    $enviadas++;
                    continue;
                }

                $mensajeError = is_array($resp)
                    ? ($resp['mensaje'] ?? $resp['message'] ?? $resp['error'] ?? 'Error desconocido')
                    : 'Respuesta invalida del servicio';
                $errores[] = 'Venta ' . $idVenta . ': ' . $mensajeError;
            }

            if ($enviadas === $total) {
                echo json_encode([
                    'enviado_sunat' => '1',
                    'mensaje' => 'Proceso terminado: ' . $enviadas . ' boleta(s) enviadas por PSE'
                ]);
                return;
            }

            if ($enviadas > 0) {
                $detalleError = implode(' | ', array_slice($errores, 0, 3));
                if (count($errores) > 3) {
                    $detalleError .= ' | ...';
                }

                echo json_encode([
                    'enviado_sunat' => '0',
                    'mensaje' => 'Proceso parcial: ' . $enviadas . ' de ' . $total . ' boleta(s) enviadas por PSE. ' . $detalleError
                ]);
                return;
            }

            $detalleError = implode(' | ', array_slice($errores, 0, 3));
            if (count($errores) > 3) {
                $detalleError .= ' | ...';
            }

            echo json_encode([
                'enviado_sunat' => '0',
                'mensaje' => 'No se pudo enviar ninguna boleta por PSE. ' . $detalleError
            ]);
        } catch (Throwable $e) {
            echo json_encode([
                'enviado_sunat' => '0',
                'mensaje' => $e->getMessage()
            ]);
        }
    }

    function send_mailer()
    {
        $negocio = "" . NAME_NEGOCIO . "";
        $server_smtp = "" . SERVER_SMTP . "";
        $email_smtp = "" . EMAIL_SMTP . "";
        $pass_smtp = "" . PASS_SMTP . "";
        $datos_factura = $this->model->pdf_factura($_POST['id_venta']);
        $api = new Email();
        // echo $_POST['id_venta'];
        // return;
        $api->sendEmail($_POST['correo_cliente'], $_POST['documento_cliente'], $_POST['n_documento_cliente'], json_encode($datos_factura), $negocio, $server_smtp, $email_smtp, $pass_smtp);
    }

}
