from PyQt5 import QtCore, QtGui, QtWidgets
from tkinter import Tk
from time import sleep
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from selenium.common.exceptions import (
    NoSuchElementException,
    ElementNotVisibleException,
)

# pylint: disable=no-name-in-module
from PyQt5.QtWidgets import QMessageBox


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        root = Tk()
        MainWindow.setObjectName("MainWindow")
        MainWindow.setWindowTitle("What A Bomb :: WhatsApp Bomber")
        warn = """
        <b>Legal disclaimer</b>: Usage of "What a Bomb" is only for educational and entertainment purpose. Developers assume no liability and are not responsible for any misuse or damage caused by this program
        """
        MainWindow.resize(674, 379)
        width = root.winfo_screenwidth()
        height = root.winfo_screenheight()
        MainWindow.move(width // 4, height // 5)
        QMessageBox.warning(MainWindow, "Disclaimer", warn)
        MainWindow.setMinimumSize(QtCore.QSize(674, 379))
        MainWindow.setMaximumSize(QtCore.QSize(674, 379))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(30, 40, 151, 30))
        self.label.setObjectName("label")
        self.cgname = QtWidgets.QLineEdit(self.centralwidget)
        self.cgname.setGeometry(QtCore.QRect(190, 40, 451, 29))
        self.cgname.setObjectName("cgname")
        self.msgs = QtWidgets.QLineEdit(self.centralwidget)
        self.msgs.setGeometry(QtCore.QRect(190, 80, 451, 29))
        self.msgs.setObjectName("msgs")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(30, 80, 151, 30))
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(30, 120, 151, 30))
        self.label_3.setObjectName("label_3")
        self.bombSend = QtWidgets.QPushButton(self.centralwidget)
        self.bombSend.setGeometry(QtCore.QRect(540, 320, 95, 31))
        self.bombSend.setObjectName("bombSend")
        self.msg = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.msg.setGeometry(QtCore.QRect(190, 130, 451, 161))
        self.msg.setObjectName("msg")
        self.about = QtWidgets.QPushButton(self.centralwidget)
        self.about.setGeometry(QtCore.QRect(420, 320, 95, 31))
        self.about.setObjectName("about")
        MainWindow.setCentralWidget(self.centralwidget)
        self.about.clicked.connect(self.MYABOUT)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        self.obj = MainWindow
        self.bombSend.clicked.connect(self.bomb)
        pass

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        self.label.setText(_translate("MainWindow", "Contact / Group Name"))
        self.cgname.setPlaceholderText(
            _translate("MainWindow",
                       "casesensitive field and enter full name"))
        self.msgs.setPlaceholderText(_translate("MainWindow", "only numbers"))
        self.label_2.setText(_translate("MainWindow", "Number of messages"))
        self.label_3.setText(_translate("MainWindow", "Message Body"))
        self.bombSend.setText(_translate("MainWindow", "Bomb"))
        self.about.setText(_translate("MainWindow", "About"))
        pass

    def bomb(self):
        global search
        search = None
        box = QtWidgets.QMessageBox(self.obj)
        target = self.cgname.text()
        number = self.msgs.text()
        mesage = self.msg.toPlainText()
        if target == "":
            box.setStandardButtons(QMessageBox.Ok)
            box.setIcon(QMessageBox.Warning)
            box.setWindowTitle("Wait!!!")
            box.setText("It seems you forgot to enter target")
            box.show()
            self.cgname.setFocus()
            return None

        try:
            number = int(number)
        except:
            QMessageBox.critical(self.obj, "Error!!!",
                                 "Enter any number starting from <b>1</b>")
            self.msgs.setFocus()
            return None

        if mesage == "":
            QtWidgets.QMessageBox.information(
                None, "No Message",
                "Since there is no input message. Taking \"Hello, {name}\"")
            mesage = "Hello, " + target

        QtWidgets.QMessageBox.information(
            self.obj,
            "The last thing",
            "<h2>We are opening your browser now, just scan QR code and rest we will do</h2>",
        )
        driver = webdriver.Chrome()
        driver.maximize_window()
        driver.get("https://web.whatsapp.com")
        while True:
            try:
                search = driver.find_element_by_xpath(
                    "/html/body/div[1]/div/div/div[3]/div/div[1]/div/label/div/div[2]"
                )
                break
            except Exception:
                pass
        search.click()
        search.send_keys(target)

        tries = 15

        while tries:
            try:
                driver.find_element_by_xpath(
                    '//span[@title = "{}"]'.format(target)).click()
                break
                tries -= 1

            except:
                pass
        else:
            QtWidgets.QMessageBox.critical(
                None, "No Account Found",
                "No user found with display name '%s'" % target)
            return None

        msg_box = driver.find_element_by_xpath(
            "/html[1]/body[1]/div[1]/div[1]/div[1]/div[4]/div[1]/footer[1]/div[1]/div[2]/div[1]/div[2]"
        )

        for i in range(number):
            msg_box.send_keys(mesage.replace("\n", Keys.SHIFT + Keys.ENTER))
            msg_box.send_keys(Keys.ENTER)
            print("sent {} messages".format(i + 1), end="\r")
        driver.quit()
        QMessageBox.information(
            self.obj,
            "Sent",
            "<span style='font-size:20px'>Target successfully bombed</span>",
        )
        pass

    def MYABOUT(self):
        box = QtWidgets.QMessageBox(self.obj)
        msg = """
        This program is coded by <b>Gurkirat Singh (T3r@bYt3)</b>. <br><br><br>
        Thanks to : <b>Sameer Bhatt</b> (for giving me the implementation example)
        """
        box.setStandardButtons(QMessageBox.Ok)
        box.setIcon(QMessageBox.Information)
        box.setWindowTitle("About")
        box.setText(msg)
        box.show()
        pass

    pass


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())