from __future__ import annotations

import datetime
import os

from pkg_resources import get_distribution

extensions = ["sphinx.ext.autodoc"]

templates_path = ["_templates"]

source_suffix = ".rst"
master_doc = "index"

project = "vdirsyncer"
copyright = "2014-{}, Markus Unterwaditzer & contributors".format(
    datetime.date.today().strftime("%Y")
)

release = get_distribution("vdirsyncer").version
version = ".".join(release.split(".")[:2])  # The short X.Y version.

rst_epilog = ".. |vdirsyncer_version| replace:: %s" % release

exclude_patterns = ["_build"]

pygments_style = "sphinx"

on_rtd = os.environ.get("READTHEDOCS", None) == "True"

try:
    import sphinx_rtd_theme

    html_theme = "sphinx_rtd_theme"
    html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
except ImportError:
    html_theme = "default"
    if not on_rtd:
        print("-" * 74)
        print("Warning: sphinx-rtd-theme not installed, building with default theme.")
        print("-" * 74)

html_static_path = ["_static"]
htmlhelp_basename = "vdirsyncerdoc"

latex_elements = {}
latex_documents = [
    (
        "index",
        "vdirsyncer.tex",
        "vdirsyncer Documentation",
        "Markus Unterwaditzer",
        "manual",
    ),
]

man_pages = [
    ("index", "vdirsyncer", "vdirsyncer Documentation", ["Markus Unterwaditzer"], 1)
]

texinfo_documents = [
    (
        "index",
        "vdirsyncer",
        "vdirsyncer Documentation",
        "Markus Unterwaditzer",
        "vdirsyncer",
        "Synchronize calendars and contacts.",
        "Miscellaneous",
    ),
]


def github_issue_role(name, rawtext, text, lineno, inliner, options=None, content=()):
    options = options or {}
    try:
        issue_num = int(text)
        if issue_num <= 0:
            raise ValueError
    except ValueError:
        msg = inliner.reporter.error(f"Invalid GitHub issue: {text}", line=lineno)
        prb = inliner.problematic(rawtext, rawtext, msg)
        return [prb], [msg]

    from docutils import nodes

    PROJECT_HOME = "https://github.com/pimutils/vdirsyncer"
    link = "{}/{}/{}".format(
        PROJECT_HOME, "issues" if name == "gh" else "pull", issue_num
    )
    linktext = ("issue #{}" if name == "gh" else "pull request #{}").format(issue_num)
    node = nodes.reference(rawtext, linktext, refuri=link, **options)
    return [node], []


def setup(app):
    from sphinx.domains.python import PyObject

    app.add_object_type(
        "storage",
        "storage",
        "pair: %s; storage",
        doc_field_types=PyObject.doc_field_types,
    )
    app.add_role("gh", github_issue_role)
    app.add_role("ghpr", github_issue_role)
