import os

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from pathlib import Path

from pages.desktop.base import Base
from pages.desktop.developers.submit_addon import SubmitAddon


class EditAddon(Base):
    """Edit page for a specific addon."""

    _root_locator = (By.CLASS_NAME, "section")
    _edit_addon_navbar_locator = (By.CLASS_NAME, "edit-addon-nav")
    _addon_name_locator = (By.CSS_SELECTOR, ".section header h2")
    _listed_addon_status_locator = (By.CSS_SELECTOR, ".addon-listed-status a")
    _last_modified_date_locator = (By.CLASS_NAME, "date-updated")
    _unlisted_version_tooltip_locator = (
        By.CLASS_NAME,
        "distribution-tag-unlisted.tooltip",
    )
    _submit_new_version_link_locator = (By.CLASS_NAME, "version-upload")
    _manage_versions_link_locator = (
        By.CSS_SELECTOR,
        "#edit-addon-nav ul:nth-child(1) li:nth-child(3)",
    )
    _edit_addon_media_button_locator = (By.CSS_SELECTOR, "#edit-addon-media a")
    _edit_addon_media_section_locator = (By.CSS_SELECTOR, "#edit-addon-media")
    _edit_addon_describe_section_locator = (By.CSS_SELECTOR, "#addon-edit-describe")
    _add_screenshot_button_locator = (By.CSS_SELECTOR, "#screenshot-upload")
    _edit_previews_error_strong_locator = (By.CSS_SELECTOR, ".error > strong")
    _edit_previews_explicit_error_locator = (By.CSS_SELECTOR, ".error > ul >li")

    def wait_for_page_to_load(self):
        self.wait.until(lambda _: self.is_element_displayed(*self._addon_name_locator))
        return self

    @property
    def name(self):
        self.wait_for_element_to_be_displayed(self._addon_name_locator)
        return self.find_element(*self._addon_name_locator).text

    @property
    def listed_addon_status(self):
        return self.find_element(*self._listed_addon_status_locator).text

    def click_upload_version_link(self):
        self.wait.until(
            EC.element_to_be_clickable(self._submit_new_version_link_locator)
        ).click()
        return SubmitAddon(self.selenium, self.base_url).wait_for_page_to_load()

    @property
    def unlisted_version_tooltip(self):
        self.wait_for_element_to_be_displayed(self._unlisted_version_tooltip_locator)
        return self.find_element(*self._unlisted_version_tooltip_locator)

    @property
    def last_modified_date(self):
        """Get the date string from the Last Update date section and format it"""
        site_date = (
            self.find_element(*self._last_modified_date_locator)
            .text.split("Last Updated: ")[1]
            .replace(".", "")
        )
        month = site_date.split()[0]
        # get only the first three letters in the month to have a uniform date structure
        final_date = site_date.replace(month, month[0:3])
        return final_date

    @property
    def edit_addon_media_button(self):
        return self.find_element(*self._edit_addon_media_button_locator)

    @property
    def edit_addon_media_section(self):
        return self.find_element(*self._edit_addon_media_section_locator)

    @property
    def edit_addon_describe_section(self):
        return self.find_element(*self._edit_addon_describe_section_locator)

    @property
    def screenshot_upload(self):
        return self.find_element(*self._add_screenshot_button_locator)

    @property
    def edit_preview_error_strong(self):
        return self.find_element(*self._edit_previews_error_strong_locator)

    @property
    def edit_preview_explicit_error(self):
        return self.find_element(*self._edit_previews_explicit_error_locator)

    def screenshot_file_upload(self, img):
        self.wait_for_element_to_be_clickable(self._add_screenshot_button_locator)
        button = self.find_element(*self._add_screenshot_button_locator)
        archive = Path(f"{os.getcwd()}/sample-addons/{img}")
        button.send_keys(str(archive))

    def click_manage_versions_link(self):
        self.wait_for_element_to_be_clickable(self._manage_versions_link_locator)
        self.find_element(*self._manage_versions_link_locator).click()
        from pages.desktop.developers.manage_versions import ManageVersions

        return ManageVersions(self.driver, self.base_url).wait_for_page_to_load()
