#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Copyright 2020-2022 F4PGA Authors
#
# 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.
#
# SPDX-License-Identifier: Apache-2.0

# Configuration file for the Sphinx documentation builder.
#
# This file only contains a selection of the most common options. For a full
# list see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html


from pathlib import Path

from collect_examples import collect_examples
from pygments.lexers.hdl import VerilogLexer
from sphinx.highlighting import lexers
from re import sub as re_sub

from os import path as os_path, environ, popen
from sys import path as sys_path

sys_path.insert(0, os_path.abspath('.'))

from markdown_code_symlinks import LinkParser, MarkdownSymlinksDomain  # noqa


lexers['verilog'] = VerilogLexer(tabsize=2)

# -- General configuration ------------------------------------------------

project = u'F4PGA Verilog to XML (V2X)'
copyright = u'2018-2022, F4PGA Authors'
author = u'F4PGA Authors'

extensions = [
    'sphinx.ext.autodoc',
    'sphinx.ext.autosummary',
    'sphinx.ext.doctest',
    'sphinx.ext.imgmath',
    'sphinx.ext.napoleon',
    'sphinx.ext.todo',
    'sphinx_markdown_tables',
    'sphinxcontrib_hdl_diagrams',
    'recommonmark'
]

hdl_diagram_yosys = "system"

templates_path = ['_templates']

source_suffix = ['.rst', '.md']
source_parsers = {
    '.md': 'markdown_code_symlinks.LinkParser',
}

master_doc = 'index'

on_rtd = environ.get('READTHEDOCS', None) == 'True'
if on_rtd:
    docs_dir = os_path.abspath(os_path.dirname(__file__))
    print("Docs dir is:", docs_dir)
    import subprocess
    subprocess.call('git fetch origin --unshallow', cwd=docs_dir, shell=True)
    subprocess.check_call('git fetch origin --tags', cwd=docs_dir, shell=True)

release = re_sub('^v', '', popen('git describe ').read().strip())
version = release

language = None

exclude_patterns = ['_build', 'env', 'Thumbs.db', '.DS_Store']

pygments_style = 'default'

todo_include_todos = True

# -- Options for HTML output ----------------------------------------------

# Enable github links when not on readthedocs
if not on_rtd:
    html_context = {
        "display_github": True,  # Integrate GitHub
        "github_user": "chipsalliance",  # Username
        "github_repo": "f4pga-v2x",  # Repo name
        "github_version": "master",  # Version
        "conf_py_path": "/doc/",
    }

html_theme = 'sphinx_f4pga_theme'

html_theme_options = {
    'repo_name': 'chipsalliance/f4pga-v2x',
    'github_url' : 'https://github.com/chipsalliance/f4pga-v2x',
    'globaltoc_collapse': True,
    'color_primary': 'indigo',
    'color_accent': 'blue',
}

html_static_path = ['_static']

html_logo = str(Path(html_static_path[0]) / 'logo.svg')
html_favicon = str(Path(html_static_path[0]) / 'favicon.svg')

# -- Options for HTMLHelp output ------------------------------------------

htmlhelp_basename = 'f4pga-v2x'

# -- Options for LaTeX output ---------------------------------------------

latex_elements = {}

latex_documents = [
    (
        master_doc, 'F4PGAV2X.tex', u'F4PGA V2X Documentation',
        u'F4PGA Authors', 'manual'),
]

# -- Options for manual page output ---------------------------------------

man_pages = [
    (master_doc, 'f4pga-v2x', u'F4PGA V2X Documentation', [author], 1)
]

# -- Options for Texinfo output -------------------------------------------

texinfo_documents = [
    (
        master_doc, 'F4PGAV2X', u'F4PGA V2X Documentation', author,
        'F4PGAV2X', 'One line description of project.', 'Miscellaneous'),
]

intersphinx_mapping = {'https://docs.python.org/': None}

def setup(app):
    # Collect tests to form examples
    collect_examples()

    github_code_repo = 'https://github.com/chipsalliance/f4pga-v2x/'
    github_code_branch = 'blob/master/'

    docs_root_dir = os_path.realpath(os_path.dirname(__file__))
    code_root_dir = os_path.realpath(os_path.join(docs_root_dir, ".."))

    MarkdownSymlinksDomain.init_domain(
        github_code_repo, github_code_branch, docs_root_dir, code_root_dir)
    MarkdownSymlinksDomain.find_links()
    app.add_domain(MarkdownSymlinksDomain)
    app.add_config_value(
        'recommonmark_config', {
            'github_code_repo': github_code_repo,
        }, True)
