# pylint: disable=too-few-public-methods
import os
import platform

from selenium import webdriver
from selenium.webdriver.chrome.options import Options as ChromeOptions
from selenium.webdriver.edge.options import Options as EdgeOptions
from selenium.webdriver.edge.service import Service as EdgeService
from selenium.webdriver.firefox.options import Options as FirefoxOptions

from conftest import CWD


class BrowserDriver:

    @staticmethod
    def get(browser=None, headless=True):
        valid_browsers = ['chrome', 'firefox', 'safari', 'edge']
        if browser in valid_browsers:
            browser_method = globals()[browser]
            return browser_method(headless)

        raise ValueError(f"'{browser}' is not a supported browser")


def chrome(headless=True):
    options = ChromeOptions()
    if headless:
        options.add_argument("--headless")
    options.add_argument('--ignore-certificate-errors')
    return webdriver.Chrome(options=options)


def firefox(headless=True):
    options = FirefoxOptions()
    if headless:
        options.add_argument("--headless")
    options.accept_insecure_certs = True
    return webdriver.Firefox(options=options)


def edge(headless=True):
    options = EdgeOptions()
    driver_name = "msedgedriver"
    if platform.system() == 'Windows':
        driver_name += ".exe"
    edgedriver_loc = os.path.join(CWD, 'drivers', driver_name)

    print("***** DRIVER DEFINED LOCATION *****")
    print(edgedriver_loc)
    if os.path.isfile(edgedriver_loc):
        print(f'\nThe file {edgedriver_loc} exists.\n')
    else:
        print(f'\nThe file {edgedriver_loc} does not exist!\n')

    options.use_chromium = True
    options.add_argument('disable-gpu')
    if headless:
        options.add_argument('headless')
    edge_service = EdgeService(executable_path=edgedriver_loc)
    edge_driver = webdriver.Edge(service=edge_service, options=options)
    return edge_driver


def safari():
    # Because safari driver is bundled with safari
    return webdriver.Safari()
