import json
import os
from random import uniform

from selenium.common import TimeoutException
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait

from modules.Tools.logger import debug
from modules.Tools.tools import *


def init_profile(mail, mobile=False):
    if not mobile:
        chrome_profile_dir = "/app/MsRewards-Reborn/user_data/profile/" + mail
    else:
        chrome_profile_dir = "/app/MsRewards-Reborn/user_data/profile/mobile-" + mail

    os.makedirs(chrome_profile_dir, exist_ok=True)

    preferences_file = os.path.join(chrome_profile_dir, "Default", "Preferences")
    if not os.path.exists(preferences_file):
        os.makedirs(os.path.join(chrome_profile_dir, "Default"), exist_ok=True)
        with open(preferences_file, "w") as f:
            json.dump(
                {
                    "intl": {
                        "accept_languages": "fr-FR,en-US,en",
                        "selected_languages": "fr-FR,en-US,en"
                    }
                }, f
            )
    else:
        with open(preferences_file, "r") as f:
            settings = json.load(f)

        if "intl" not in settings:
            settings["intl"] = {}

        settings["intl"]["accept_languages"] = "fr-FR,en-US,en"
        settings["intl"]["selected_languages"] = "fr-FR,en-US,en"

        with open(preferences_file, "w") as f:
            json.dump(settings, f)

    return chrome_profile_dir


# Deal with RGPD popup as well as some random popup like 'are you satisfied' one
def rgpd_popup(config) -> None:
    for i in ["bnp_btn_accept", "bnp_hfly_cta2", "bnp_hfly_close"]:
        try:
            config.WebDriver.driver.find_element(By.ID, i).click()
        except Exception as err:
            debug(err)


"""
send_keys_wait([selenium element:element, str:keys]) send the different keys to the field element, with a random 
time between each press to simulate human action.
keys can be an string, but also selenium keys
"""


def send_keys_wait(element, keys: str) -> None:
    for i in keys:
        element.send_keys(i)
        sleep(uniform(0.1, 0.3))


def send_wait_and_confirm(element, keys: str) -> None:
    send_keys_wait(element, keys)
    element.send_keys(Keys.ENTER)


# Wait for the presence of the element identifier or [timeout]s
def wait_until_visible(search_by: str, identifier: str, timeout: int = 20, browser=None, raise_error=True) -> bool:
    try:
        WebDriverWait(browser, timeout).until(
            expected_conditions.visibility_of_element_located((search_by, identifier)), "element not found")
        return True
    except TimeoutException as e:
        f = error if raise_error else debug
        f(f"element {identifier} not found after {timeout}s")
        return False