from webdriver_manager.core.driver import Driver
from webdriver_manager.core.logger import log


class OperaDriver(Driver):
    def __init__(
            self,
            name,
            driver_version,
            url,
            latest_release_url,
            opera_release_tag,
            http_client,
            os_system_manager
    ):
        super(OperaDriver, self).__init__(
            name,
            driver_version,
            url,
            latest_release_url,
            http_client,
            os_system_manager
        )
        self.opera_release_tag = opera_release_tag

    def get_latest_release_version(self) -> str:
        resp = self._http_client.get(
            url=self.latest_release_url,
            headers=self.auth_header
        )
        return resp.json()["tag_name"]

    def get_driver_download_url(self, os_type) -> str:
        """Like https://github.com/operasoftware/operachromiumdriver/releases/download/v.2.45/operadriver_linux64.zip"""
        driver_version_to_download = self.get_driver_version_to_download()
        log(f"Getting latest opera release info for {driver_version_to_download}")
        resp = self._http_client.get(
            url=self.tagged_release_url(driver_version_to_download),
            headers=self.auth_header
        )
        assets = resp.json()["assets"]
        name = "{0}_{1}".format(self.get_name(), os_type)
        output_dict = [asset for asset in assets if asset["name"].startswith(name)]
        if not output_dict:
            available_assets = ", ".join(asset.get("name", "") for asset in assets)
            raise ValueError(
                f"Could not find OperaDriver asset for '{name}'. Available assets: {available_assets}"
            )
        return output_dict[0]["browser_download_url"]

    @property
    def latest_release_url(self):
        return self._latest_release_url

    def tagged_release_url(self, version):
        return self.opera_release_tag.format(version)

    def get_browser_type(self):
        return "opera"
