# PrintView: Preview dan test print terpusat di sini
from PySide6.QtWidgets import QWidget, QMessageBox
from PySide6.QtPrintSupport import QPrintPreviewDialog
from PySide6.QtPrintSupport import QPrinter
from PySide6.QtCore import QSizeF
from PySide6.QtGui import QPainter

class PrintView(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        from pypos.core.utils.window_size_helper import set_window_size_by_screen
        set_window_size_by_screen(self)

    def show_preview(self, doc, printer=None):
        preview_printer = printer or QPrinter(QPrinter.HighResolution)
        dialog = QPrintPreviewDialog(preview_printer, self)
        dialog.setWindowTitle("Preview Struk/Settlement")

        # edited by glg
        # Render langsung via QPainter untuk menghindari preview kosong/silent-fail.
        def paint_preview(target_printer):
            painter = QPainter()
            try:
                if painter.begin(target_printer):
                    doc.drawContents(painter)
                else:
                    doc.print_(target_printer)
            except (TypeError, ValueError, KeyError, AttributeError, RuntimeError, OSError, LookupError, ArithmeticError, ImportError) as exc:
                try:
                    doc.print_(target_printer)
                except (TypeError, ValueError, KeyError, AttributeError, RuntimeError, OSError, LookupError, ArithmeticError, ImportError):
                    print(f"[PrintView] Gagal render preview: {exc}")
            finally:
                if painter.isActive():
                    painter.end()

        try:
            dialog.setZoomMode(QPrintPreviewDialog.FitToWidth)
        except (TypeError, ValueError, KeyError, AttributeError, RuntimeError, OSError, LookupError, ArithmeticError, ImportError):
            pass
        dialog.paintRequested.connect(paint_preview)
        dialog.exec()

    def show_preview_raw(self, render_func, printer, width_pt):
        """Preview untuk raw painter approach"""
        dialog = QPrintPreviewDialog(printer, self)
        dialog.setWindowTitle("Preview Struk/Settlement")

        def paint_preview(preview_printer):
            """Paint callback untuk preview - QPrintPreviewDialog memberikan printer object"""
            from PySide6.QtGui import QPainter
            painter = QPainter()
            if painter.begin(preview_printer):
                render_func(painter)
                painter.end()

        dialog.paintRequested.connect(paint_preview)
        dialog.exec()

    def show_test_print_result(self, result):
        msg = QMessageBox(self)
        if isinstance(result, dict):
            status = result.get("status") or result.get("ok") or result.get("success")
            detail = result.get("message") or result.get("reason") or str(result)
        else:
            status = result
            detail = str(result)
        ok = str(status).lower() in ("1", "true", "ok", "success", "berhasil")
        msg.setIcon(QMessageBox.Information if ok else QMessageBox.Warning)
        msg.setWindowTitle("Test Print")
        msg.setText("Test print berhasil." if ok else "Test print gagal.")
        msg.setInformativeText(detail)
        msg.setStandardButtons(QMessageBox.Ok)
        msg.exec()
