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))