from .http import session
import mwclient


def instanciate(site):
    """
    Instancie un objet permettant d’accéder à l’API d’un site MediaWiki.

    :param site: Nom de domaine du site.
    :return: Instance mwclient.Site pour le site.
    """
    return mwclient.Site(site, pool=session)


def article_canonical(site, article):
    """
    Obtient le nom canonique d’un article après avoir suivi les redirections.

    :param site: Instance mwclient.Site pour le site ciblé.
    :param article: Article ciblé dans le site.
    :return: Nom canonique de l’article.
    """
    original_page = site.pages[article]

    if not original_page.exists:
        raise Exception(
            'Article « {} » inexistant sur {}'
            .format(article, site.host)
        )

    return original_page.resolve_redirect().name


def article_redirects(site, article):
    """
    Récupère l’ensemble des pages redirigeant vers un article.

    :param site: Instance mwclient.Site pour le site ciblé.
    :param article: Article ciblé dans le site.
    :return: Liste des pages redirigeant vers `article`.
    """
    response = site.api('query', prop='redirects', titles=article)
    page_response = list(response['query']['pages'].values())[0]

    if 'missing' in page_response:
        raise Exception(
            'Article « {} » inexistant sur {}'
            .format(article, site.host)
        )

    # Si la réponse n’inclut pas la clé « redirects », c’est qu’il n’existe
    # aucune redirection vers la page
    return [
        item['title'] for item in
        page_response['redirects']
    ] if 'redirects' in page_response else []
