from urllib.parse import urlparse


class TwLink:
    """
    Disclaimer.

    I have no relation with fxtwitter, nor vxtwitter, or anything else being used there.
    """
    _user: str
    _post_id: str
    _url: str
    _prefix: [str]  # List of valid fxshit
    _valid_url = False

    def __init__(self, url: str):
        self._url = url
        self.__review_url()
        self._prefix = [
            "https://fxtwitter.com",
            "https://vxtwitter.com"
        ]

        pass

    def __review_url(self) -> None:
        """
        Checks if twitter URL is a valid post.

        It requires:
         - Twitter domain.
         - /status/
         - Username
         - Post ID

        :return: STR, returns "fixed" URL if given URL is valid.
        Returns nothing if isn't valid.
        """

        valid_twitter_hosts = ["twitter.com"]
        parsed_url = urlparse(url=self._url)
        host = parsed_url.netloc
        path: str | [str] = parsed_url.path
        if path.startswith("/"):
            # Remove initial /
            path = path[1:]
        path = path.split("/")

        if host not in valid_twitter_hosts \
                or len(path) > 3 \
                or path[1].lower() != "status":
            print(f"URL '{self._url}' is NOT valid!")
        else:
            print(f"URL '{self._url}' is valid")
            self._valid_url = True
            self._user = path[0]
            self._post_id = path[2]

    @property
    def __return_url(self) -> str:
        """
        Returns the URL if the class been flagged as valid URL.

        Retrusn an empty string if it's not flagged as valid URL.
        :return:
        """

        if self._valid_url:
            return f"{self._prefix[0]}/{self._user}/status/{self._post_id}"
        else:
            return ""

    def __str__(self) -> str:
        return self.__return_url

    def __bool__(self) -> bool:
        if self.__return_url is not None:
            return True

    def __call__(self, *args, **kwargs) -> str:
        return self.__str__()

    def __int__(self):
        return len(self.__str__())