import math

import allure
from selenium.common.exceptions import NoSuchElementException, NoAlertPresentException, TimeoutException
from selenium.webdriver.support.expected_conditions import presence_of_element_located
from selenium.webdriver.support.wait import WebDriverWait

from .locators import BasePageLocators


class BasePage:
    def __init__(self, browser, url, name, timeout=10):
        self.browser = browser
        self.url = url
        self.name = name
        self.browser.implicitly_wait(timeout)

    def open(self):
        with allure.step(f'Открываем страницу {self.url}'):
            self.browser.get(self.url)

    @allure.step('Переходим на страницу логина / регистрации')
    def go_to_login_page(self):
        link = self.browser.find_element(*BasePageLocators.LOGIN_LINK)
        link.click()

    @allure.step('Переходим на страницу с корзиной')
    def go_to_basket(self):
        link = self.browser.find_element(*BasePageLocators.BASKET_LINK)
        link.click()

    @allure.step('Проверяем, что кнопка перехода на страницу логина / регистрации есть на странице')
    def should_be_login_link(self):
        assert self.is_element_present(*BasePageLocators.LOGIN_LINK), \
            'Нет кнопки логина на странице'

    @allure.step('Проверяем, что кнопка перехода в корзину есть на странице')
    def should_be_basket_link(self):
        assert self.is_element_present(*BasePageLocators.BASKET_LINK), \
            'Нет кнопки перехода в корзину на странице'

    @allure.step('Проверяем, что есть иконка пользователя, то есть человек залогинен')
    def should_be_authorized_user(self):
        assert self.is_element_present(*BasePageLocators.USER_ICON), \
            'Нет иконки пользователя, скорее всего пользователь не авторизован'

    def is_element_present(self, how, what):
        try:
            self.browser.find_element(how, what)
        except NoSuchElementException:
            return False
        return True

    def is_not_element_present(self, how, what, timeout_in_seconds=4):
        try:
            WebDriverWait(self.browser, timeout_in_seconds).until(presence_of_element_located((how, what)))
        except TimeoutException:
            return True
        return False

    def is_disappeared(self, how, what, timeout_in_seconds=4):
        try:
            WebDriverWait(self.browser, timeout_in_seconds,
                          poll_frequency=1, ignored_exceptions=TimeoutException). \
                until_not(presence_of_element_located((how, what)))
        except TimeoutException:
            return False
        return True

    @allure.step('Решаем задачку и получаем код для вставки на Степик')
    def solve_quiz_and_get_code(self):
        alert = self.browser.switch_to.alert
        x = alert.text.split(" ")[2]
        answer = str(math.log(abs((12 * math.sin(float(x))))))
        alert.send_keys(answer)
        alert.accept()
        try:
            alert = self.browser.switch_to.alert
            alert_text = alert.text
            print(f"Код для вставки на Степик: {alert_text}")
            alert.accept()
        except NoAlertPresentException:
            print("Второй алерт не появился :(")
