import logging

from pypos.core.utils.ui_message_utils import sanitize_ui_message
from pypos.core.utils.toast_utils import show_global_toast

LOGGER = logging.getLogger(__name__)


class BaseView:
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if not hasattr(self, "controller"):
            self.controller = None

    def set_controller(self, controller):
        self.controller = controller
        return self.controller

    def show_error(self, message, title="Error"):
        self._show_message("critical", title, message)

    def show_warning(self, title, message=None):
        if message is None:
            message = title
            title = "Peringatan"
        self._show_message("warning", title, message)

    def show_info(self, title, message=None):
        if message is None:
            message = title
            title = "Informasi"
        self._show_message("information", title, message)

    def show_confirm(self, title, message):
        return self._show_question(title, message)

    def show_confirmation(self, title, message):
        return self._show_question(title, message)

    def show_toast(self, message, duration_ms=1400, level="info"):
        safe_message, sanitized = sanitize_ui_message("information", message)
        if sanitized:
            LOGGER.warning("UI toast sanitized in %s: %s", self.__class__.__name__, message)
        try:
            show_global_toast(self, safe_message, duration_ms=duration_ms, level=level)
        except (AttributeError, RuntimeError, TypeError):
            LOGGER.info("[%s] %s", self.__class__.__name__, safe_message)

    def _show_message(self, level, title, message):
        safe_title = str(title or "Informasi")
        safe_message, sanitized = sanitize_ui_message(level, message)
        safe_message = str(safe_message or "")
        if sanitized:
            LOGGER.warning("UI message sanitized in %s: %s", self.__class__.__name__, message)
        try:
            from PySide6.QtWidgets import QMessageBox

            level_map = {
                "critical": QMessageBox.critical,
                "warning": QMessageBox.warning,
                "information": QMessageBox.information,
            }
            handler = level_map.get(level, QMessageBox.information)
            handler(self, safe_title, safe_message)
        except (ImportError, ModuleNotFoundError, RuntimeError, TypeError):
            LOGGER.info("[%s] %s", safe_title, safe_message)

    def _show_question(self, title, message):
        safe_title = str(title or "Konfirmasi")
        safe_message = str(message or "")
        try:
            from PySide6.QtWidgets import QMessageBox

            reply = QMessageBox.question(
                self,
                safe_title,
                safe_message,
                QMessageBox.Yes | QMessageBox.No,
                QMessageBox.No,
            )
            return reply == QMessageBox.Yes
        except (ImportError, ModuleNotFoundError, RuntimeError, TypeError):
            LOGGER.warning("Konfirmasi fallback tanpa UI: [%s] %s", safe_title, safe_message)
            return False

    def _log(self, level, message):
        name = self.__class__.__name__
        safe_level = str(level or "INFO").upper()
        level_num = getattr(logging, safe_level, logging.INFO)
        LOGGER.log(level_num, "[%s] %s", name, message)

    def log_debug(self, message):
        self._log("DEBUG", message)

    def log_info(self, message):
        self._log("INFO", message)

    def log_warning(self, message):
        self._log("WARN", message)

    def log_error(self, message):
        self._log("ERROR", message)
