import logging
from selenium.webdriver.support.ui import Select
logging.basicConfig()
LOG = logging.getLogger(' Page object: ')


class TableCellClass:
    table = None

    def __init__(self, obj):
        if not obj:
            LOG.error('TableCell does not found')
        self.table = obj

    def Text(self):
        if self.table:
            return self.table.text()
        else:
            return ''


class ButtonClass:
    button = None

    def __init__(self, obj):
        if not obj:
            LOG.error('Button does not found')
        self.button = obj

    def Click(self):
        if self.button:
            self.button.click()

    def isPresented(self):
        if self.button:
            return True
        return False


class LinkClass:
    link = None

    def __init__(self, obj):
        if not obj:
            LOG.error('Link does not found')
        self.link = obj

    def Click(self):
        if self.link:
            self.link.click()

    def isPresented(self):
        if self.link:
            return True
        return False

    def Address(self):
        if self.link:
            return self.link.get_attribute('href')
        else:
            return ''


class EditBoxClass:

    def __init__(self, obj):
        if not obj:
            LOG.error('EditBox does not found')
        self.edit = obj

    def isPresented(self):
        if self.edit:
            return True
        return False

    def Set(self, value):
        if self.edit:
            self.edit.clear()
            self.edit.send_keys(value)

    def Text(self):
        if self.edit:
            return self.edit.get_text()
        else:
            return ''


class DropDownListClass:
    select = None

    def __init__(self, obj):
        if not obj:
            LOG.error('DropDownList does not found')
        self.select = obj

    def isPresented(self):
        if self.select is not None:
            return True
        return False

    def Set(self, value):
        if self.select:
            Select(self.select).select_by_visible_text(value)

    def Text(self):
        if self.select:
            return self.select.get_text()
        else:
            return ''


error_msg = """
                Object with parameter: %s
                does not found on page.
            """


class Page:

    driver = None
    timeout = 30

    def __init__(self, driver):
        driver.set_page_load_timeout(30)
        driver.implicitly_wait(0.01)
        self.driver = driver

    def _find_element(self, parameter):
        obj = None
        k = 0
        while (obj is None and k < self.timeout):
            k += 1
            try:
                obj = self.driver.find_element_by_name(parameter)
                return obj
            except:
                pass
            try:
                obj = self.driver.find_element_by_id(parameter)
                return obj
            except:
                pass
            try:
                obj = self.driver.find_element_by_xpath(parameter)
                return obj
            except:
                pass
            try:
                obj = self.driver.find_element_by_partial_link_text(parameter)
                return obj
            except:
                pass

        LOG.error(error_msg % parameter)
        return None

    def Open(self, url):
        self.driver.get(url)

    def Refresh(self):
        self.driver.refresh()

    def TableCell(self, name):
        obj = self._find_element(name)
        table = TableCellClass(obj)
        return table

    def Button(self, name):
        obj = self._find_element(name)
        button = ButtonClass(obj)
        return button

    def Link(self, name):
        obj = self._find_element(name)
        link = LinkClass(obj)
        return link

    def EditBox(self, name):
        obj = self._find_element(name)
        edit = EditBoxClass(obj)
        return edit

    def DropDownList(self, name):
        obj = self._find_element(name)
        select = DropDownListClass(obj)
        return select

    def Navigate(self, path):
        steps = path.split(':')

        for step in steps:
            self.Button(step).Click()