## Licensed under the Apache License, Version 2.0 (the "License"); you may not
## use this file except in compliance with the License. You may obtain a copy of
## the License at
##
##   http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing, software
## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
## License for the specific language governing permissions and limitations under
## the License.

import datetime
import os
import sys

import sphinx_rtd_theme

sys.path.insert(0, os.path.abspath("../ext"))

needs_sphinx = "5.1.1"

extensions = [
    "sphinx.ext.todo",
    "sphinx.ext.extlinks",
    "sphinxcontrib.httpdomain",
    "configdomain",
]

nitpicky = True

# should be over-written using rebar-inherited settings
version = "3.2"
release = "3.2.0"

project = "Apache CouchDB\u00ae"

copyright = "%d, %s" % (
    datetime.datetime.now().year,
    "Apache Software Foundation. CouchDB\u00ae is a registered trademark of the "
    + "Apache Software Foundation",
)

primary_domain = "http"

pygments_style = "sphinx"

html_theme = "sphinx_rtd_theme"
html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]

html_theme_options = {"canonical_url": "https://docs.couchdb.org/en/stable/"}

templates_path = ["../templates"]

html_static_path = ["../static"]

html_title = " ".join([project, version, "Documentation"])

html_logo = "../images/logo.png"

html_favicon = "../images/favicon.ico"

html_use_index = False

html_additional_pages = {"download": "pages/download.html", "index": "pages/index.html"}

html_context = {
    "ga_code": "UA-658988-6",
    # Enable the "Edit in GitHub link within the header of each page.
    "display_github": False,
    # Set the following variables to generate the resulting github URL for each page.
    # Format Template: https://{{ github_host|default("github.com") }}/{{ github_user }}/{{ github_repo }}/blob/{{ github_version }}{{ conf_py_path }}{{ pagename }}{{ suffix }}
    "github_version": "main",
    "conf_py_path": "/src/docs/src/",
    "github_user": "apache",
    "github_repo": "couchdb",
    "rtd_ver": os.environ.get("READTHEDOCS_VERSION_NAME") or "latest",
}

http_index_shortname = 'API Reference'

http_index_localname = "API Quick Reference"

text_newlines = "native"

latex_documents = [("index", "CouchDB.tex", project, "", "manual", True)]

latex_elements = {"papersize": "a4paper"}

texinfo_documents = [
    (
        "contents",
        "CouchDB",
        project,
        "",
        "CouchDB",
        "The Apache CouchDB database",
        "Databases",
        True,
    )
]

extlinks = {
    "issue": ("https://issues.apache.org/jira/browse/COUCHDB-%s", "COUCHDB-%s"),
    "ghissue": ("https://github.com/apache/couchdb/issues/%s", "#%s"),
    "commit": (
        "https://git-wip-us.apache.org/repos/asf?p=couchdb.git;a=commit;h=%s",
        "#%s",
    ),
}


def setup(app):
    app.add_css_file("css/rtd_theme.css")
