# Importing necessary classes from PyQt5 library
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import QIcon
from PyQt5.QtWebEngineWidgets import *

class MyWebBrowser(): # Creating a class for the web browser
    """
    A simple web browser application using PyQt5.
    """
    def __init__(self):
        """
        Initialize the web browser.
        """
        self.window = QWidget() # Creating a QWidget instance
        self.window.setWindowTitle("My Web Browser") # Setting the window title

        # main layout: holds browser and horizontal layout
        self.layout = QVBoxLayout()
        # holds the buttons and url bar
        self.horizontal = QHBoxLayout()

        self.url_bar = QLineEdit()
        self.url_bar.setMaximumHeight(30)

        self.go_btn = QPushButton("Go")
        self.go_btn.setMinimumHeight(30)

        # to load a page when enter is pressed in the url bar
        self.url_bar.returnPressed.connect(self.go_btn.click)  # Connect the returnPressed signal to the go_btn click slot

        self.back_btn = QPushButton("<")
        self.back_btn.setMinimumHeight(30)

        self.forward_btn = QPushButton(">")
        self.forward_btn.setMinimumHeight(30)

        self.reload_btn = QPushButton()
        self.reload_btn.setIcon(QIcon('images/reload.png'))  # Set the icon using the image file path
        self.reload_btn.setMinimumHeight(30)

        # Adding the widgets to the horizontal layout
        self.horizontal.addWidget(self.reload_btn)
        self.horizontal.addWidget(self.url_bar)
        self.horizontal.addWidget(self.go_btn)
        self.horizontal.addWidget(self.back_btn)
        self.horizontal.addWidget(self.forward_btn)

        self.browser = QWebEngineView()

        # connecting buttons
        self.go_btn.clicked.connect(lambda: self.navigate(self.url_bar.text()))
        self.back_btn.clicked.connect(self.go_back)
        self.forward_btn.clicked.connect(self.go_forward)
        self.reload_btn.clicked.connect(self.browser.reload)

        self.layout.addLayout(self.horizontal)  # Adding the horizontal layout to the main layout
        self.layout.addWidget(self.browser) # Adding the browser to the main layout

        self.browser.setUrl(QUrl("https://google.com")) # Setting the initial URL for the browser

        self.window.setLayout(self.layout) # Setting the main layout for the window

        self.window.show()


    def navigate(self, url):
        """
        Navigate to the specified URL.

        Args:
            url (str): The URL to navigate to.
        """
        if not url.startswith("http"): # Checking if the URL does not start with "http"
            url = "https://" + url # Prepending "https://" to the URL
            self.url_bar.setText(url)  # Updating the URL bar text with the modified URL
        self.browser.setUrl(QUrl(url))  # Navigating the browser to the specified URL

    def go_back(self):
        """
        Go back to the previous page.
        """
        self.url_bar.setText("") 
        self.browser.back()

    def go_forward(self):
        """
        Go forward to the next page.
        """
        self.url_bar.setText("") 
        self.browser.forward()
    

app = QApplication([]) # Creating a QApplication instance
window = MyWebBrowser() # Creating an instance of the MyWebBrowser class
app.exec_() # Starting the application event loop