from urllib.parse import urlparse

from youtube_urls_validator.utils import exceptions

MAIN_HOST = 'youtube.com'
POSSIBLE_HOSTS = ['youtu.be', 'youtube.ae', 'youtube.al', 'youtube.am', 'youtube.at', 'youtube.az', 'youtube.ba',
                  'youtube.be', 'youtube.bg', 'youtube.bh', 'youtube.bo', 'youtube.by', 'youtube.ca', 'youtube.cat',
                  'youtube.ch', 'youtube.cl', 'youtube.co', 'youtube.co.ae', 'youtube.co.at', 'youtube.co.cr',
                  'youtube.co.hu', 'youtube.co.id', 'youtube.co.il', 'youtube.co.in', 'youtube.co.jp', 'youtube.co.ke',
                  'youtube.co.kr', 'youtube.co.ma', 'youtube.co.nz', 'youtube.co.th', 'youtube.co.tz', 'youtube.co.ug',
                  'youtube.co.uk', 'youtube.co.ve', 'youtube.co.za', 'youtube.co.zw', 'youtube.com.ar',
                  'youtube.com.au', 'youtube.com.az', 'youtube.com.bd', 'youtube.com.bh', 'youtube.com.bo',
                  'youtube.com.br', 'youtube.com.by', 'youtube.com.co', 'youtube.com.do', 'youtube.com.ec',
                  'youtube.com.ee', 'youtube.com.eg', 'youtube.com.es', 'youtube.com.gh', 'youtube.com.gr',
                  'youtube.com.gt', 'youtube.com.hk', 'youtube.com.hn', 'youtube.com.hr', 'youtube.com.jm',
                  'youtube.com.jo', 'youtube.com.kw', 'youtube.com.lb', 'youtube.com.lv', 'youtube.com.ly',
                  'youtube.com.mk', 'youtube.com.mt', 'youtube.com.mx', 'youtube.com.my', 'youtube.com.ng',
                  'youtube.com.ni', 'youtube.com.om', 'youtube.com.pa', 'youtube.com.pe', 'youtube.com.ph',
                  'youtube.com.pk', 'youtube.com.pt', 'youtube.com.py', 'youtube.com.qa', 'youtube.com.ro',
                  'youtube.com.sa', 'youtube.com.sg', 'youtube.com.sv', 'youtube.com.tn', 'youtube.com.tr',
                  'youtube.com.tw', 'youtube.com.ua', 'youtube.com.uy', 'youtube.com.ve', 'youtube.cr', 'youtube.cz',
                  'youtube.de', 'youtube.dk', 'youtube.ee', 'youtube.es', 'youtube.fi', 'youtube.fr', 'youtube.ge',
                  'youtube.googleapis.com', 'youtube.gr', 'youtube.gt', 'youtube.hk', 'youtube.hr', 'youtube.hu',
                  'youtube.ie', 'youtube.in', 'youtube.iq', 'youtube.is', 'youtube.it', 'youtube.jo', 'youtube.jp',
                  'youtube.kr', 'youtube.kz', 'youtube.la', 'youtube.lk', 'youtube.lt', 'youtube.lu', 'youtube.lv',
                  'youtube.ly', 'youtube.ma', 'youtube.md', 'youtube.me', 'youtube.mk', 'youtube.mn', 'youtube.mx',
                  'youtube.my', 'youtube.ng', 'youtube.ni', 'youtube.nl', 'youtube.no', 'youtube.pa', 'youtube.pe',
                  'youtube.ph', 'youtube.pk', 'youtube.pl', 'youtube.pr', 'youtube.pt', 'youtube.qa', 'youtube.ro',
                  'youtube.rs', 'youtube.ru', 'youtube.sa', 'youtube.se', 'youtube.sg', 'youtube.si', 'youtube.sk',
                  'youtube.sn', 'youtube.soy', 'youtube.sv', 'youtube.tn', 'youtube.tv', 'youtube.ua', 'youtube.ug',
                  'youtube.uy', 'youtube.vn', 'youtubekids.com', 'yt.be', 'youtube.com', 'youtube.com']


def validate_url(url: str) -> str:
    """
    Validate YouTube URL

    Parameters:
        url (``str``):
            Url to validate

    Returns:
        :obj:`str`: validated URL

    Raises:
        CantFindHostnameError:
            Can't find URL's hostname.

        HostNotInPossibleHostsError:
            URL's host not in possible hosts.
    """
    if url.startswith('https://') or url.startswith('http://'):
        parsed_url = urlparse(url=url.replace('http://', 'https://').replace('www.', ''))
    else:
        parsed_url = urlparse(url=url.replace('www.', ''))
        if parsed_url.scheme:
            raise exceptions.InvalidSchemeError(url=url.replace('www.', ''))

        parsed_url = urlparse(url=f'https://{url.replace("www.", "")}')

    if parsed_url.hostname not in POSSIBLE_HOSTS:
        raise exceptions.HostNotInPossibleHostsError(url=url, possible_hosts=POSSIBLE_HOSTS)

    return f'https://{MAIN_HOST}{parsed_url.path}'.strip().strip('/')
