import sys
import traceback

from PyQt5.QtWidgets import QMessageBox, QWidget

from urh.util.Formatter import Formatter
from urh.util.Logger import logger


class Errors:
    @staticmethod
    def generic_error(title: str, msg: str, detailed_msg: str = None):
        w = QWidget()
        if detailed_msg:
            msg = (
                "Error: <b>"
                + msg.replace("\n", "<br>")
                + "</b>"
                + "<br><br>----------<br><br>"
                + detailed_msg.replace("\n", "<br>")
            )
        QMessageBox.critical(w, title, msg)

    @staticmethod
    def exception(exception: Exception):
        logger.exception(exception)
        w = QWidget()
        msg = "Error: <b>" + str(exception).replace("\n", "<br>") + "</b><hr>"
        msg += traceback.format_exc().replace("\n", "<br>")
        QMessageBox.critical(w, "An error occurred", msg)

    @staticmethod
    def no_device():
        w = QWidget()
        QMessageBox.critical(
            w,
            w.tr("No devices"),
            w.tr(
                "You have to choose at least one available "
                "device in Edit->Options->Device."
            ),
        )

    @staticmethod
    def empty_selection():
        w = QWidget()
        QMessageBox.critical(w, w.tr("No selection"), w.tr("Your selection is empty!"))

    @staticmethod
    def write_error(msg):
        w = QWidget()
        QMessageBox.critical(
            w,
            w.tr("Write error"),
            w.tr("There was a error writing this file! {0}".format(msg)),
        )

    @staticmethod
    def usrp_found():
        w = QWidget()
        QMessageBox.critical(
            w,
            w.tr("USRP not found"),
            w.tr("USRP could not be found . Is the IP " "correct?"),
        )

    @staticmethod
    def hackrf_not_found():
        w = QWidget()

        if sys.platform == "win32":
            msg = (
                "Could not connect to HackRF. Try these solutions:"
                "<br/><br/> 1. Ensure HackRF is plugged in."
                "<br/> 2. <b>Install HackRF USB driver</b> with <a href='http://zadig.akeo.ie/'>Zadig</a>."
            )
        else:
            msg = (
                "Could not connect to HackRF. Try these solutions:"
                "<br/><br/> 1. Ensure HackRF is plugged in."
                "<br/> 2. Run the command <b>hackrf_info</b> in terminal as root."
                "<br/> 3. If 2. works for you, follow the instructions "
                "<a href='https://github.com/mossmann/hackrf/wiki/FAQ'>here</a>."
            )

        QMessageBox.critical(w, w.tr("HackRF not found"), w.tr(msg))

    @staticmethod
    def gnuradio_not_installed():
        w = QWidget()
        QMessageBox.critical(
            w,
            w.tr("GNU Radio not found"),
            w.tr("You need to install GNU Radio for this " "feature."),
        )

    @staticmethod
    def rtlsdr_sdr_driver():
        if sys.platform == "win32":
            w = QWidget()
            QMessageBox.critical(
                w,
                w.tr("Could not access RTL-SDR device"),
                w.tr(
                    "You may need to reinstall the driver with Zadig for 'Composite' device.<br>"
                    "See <a href='https://github.com/jopohl/urh/issues/389'>here</a> "
                    "for more information."
                ),
            )

    @staticmethod
    def empty_group():
        w = QWidget()
        QMessageBox.critical(
            w, w.tr("Empty group"), w.tr("The group may not be empty.")
        )

    @staticmethod
    def invalid_path(path: str):
        w = QWidget()
        QMessageBox.critical(
            w, w.tr("Invalid Path"), w.tr("The path {0} is invalid.".format(path))
        )

    @staticmethod
    def network_sdr_send_is_elsewhere():
        w = QWidget()
        QMessageBox.information(
            w,
            "This feature is elsewhere",
            "You can send your data with the network SDR by "
            "using the button below the generator table.",
        )

    @staticmethod
    def not_enough_ram_for_sending_precache(memory_size_bytes):
        w = QWidget()
        if memory_size_bytes:
            msg = (
                "Precaching all your modulated data would take <b>{0}B</b> of memory, "
                "which does not fit into your RAM.<br>".format(
                    Formatter.big_value_with_suffix(memory_size_bytes)
                )
            )
        else:
            msg = ""

        msg += (
            "Sending will be done in <b>continuous mode</b>.<br><br>"
            "This means, modulation will be performed live during sending.<br><br>"
            "If you experience problems, "
            "consider sending less messages or upgrade your RAM."
        )

        QMessageBox.information(w, w.tr("Entering continuous send mode"), w.tr(msg))
