# -*- coding: utf-8 -*-
# Style_Check:Python_Fragment (meaning no pyflakes check)
#
# GNAT build configuration file
# --------------------------------
# This file defines the configuration for all files created
# by Sphinx. In this case, pdf (using latex) and html

import sys
import os
import time
import re

sys.path.append('.')

import ada_pygments
import latex_elements

# Define list of documents to be built and their title
DOCS = {
    "gnat_rm": {"title": "GNAT Reference Manual"},
    "gnat_ugn": {"title": "GNAT User's Guide for Native Platforms"},
    "gnat-style": {"title": "GNAT Coding Style: A Guide for GNAT Developers"},
}

# Then retrieve the source directory
root_source_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
gnatvsn_spec = os.path.join(root_source_dir, '..', 'gnatvsn.ads')
basever = os.path.join(root_source_dir, '..', '..', 'BASE-VER')
texi_fsf = True  # Set to False when FSF doc is switched to sphinx by default

# get vsn specs
with open(gnatvsn_spec, 'r') as fd:
    gnatvsn_content = fd.read()


# read copyright test from .rst file (used also for sanity-checking)
def get_copyright():
    return '2008-%s, Free Software Foundation' % time.strftime('%Y')


# get environment gnat version (used also for sanity-checking)
def get_gnat_version():
    m = re.search(r'Gnat_Static_Version_String : ' +
                  r'constant String := "([^\(\)]+)\(.*\)?";',
                  gnatvsn_content)
    if m:
        return m.group(1).strip()
    else:
        if texi_fsf and os.path.exists(basever):
            return ''

        try:
            with open(basever) as fd:
                return fd.read()
        except Exception:
            pass

    print('cannot find GNAT version in gnatvsn.ads or in ' + basever)
    sys.exit(1)


# get gnat build type from runtime
def get_gnat_build_type():
    m = re.search(r'Build_Type : constant Gnat_Build_Type := (.+);',
                  gnatvsn_content)
    if m:
        return {'Gnatpro': 'PRO',
                'FSF': 'FSF',
                'GPL': 'GPL'}[m.group(1).strip()]
    else:
        print('cannot compute GNAT build type')
        sys.exit(1)


# Enable Sphinx extensions
# Note that these are active for all files to be build (see DOCS list)
extensions = ['sphinx_rtd_theme']

# todo interprets ".. todo::" commands in .rst files
# mathjax enables math equations to render correctly
extensions += ['sphinx.ext.todo', 'sphinx.ext.mathjax']
todo_include_todos = True

# define templates source folder
templates_path = ['_templates']
# define the types of files to read as source for documents
source_suffix = '.rst'

# enable figure, object, table numeration on documents
print('enabling table, code-block and figure numeration')
numfig = True
numfig_format = {
    'figure': 'figure %s',
    'table': 'table %s',
    'code-block': 'listing %s',
    'section': 'section %s',
}
print('done')


# Start building the documents
# First retrieve the name of the documentation we are building
print('checking doc name... ')
doc_name = os.environ.get('DOC_NAME', None)
if doc_name is None:
    print('DOC_NAME environment variable should be set')
    sys.exit(1)

if doc_name not in DOCS:
    print('%s is not a valid documentation name' % doc_name)
    sys.exit(1)
print('found... ' , doc_name)

# Exclude sources that are not part of the current documentation
exclude_patterns = []
for d in os.listdir(root_source_dir):
    if d not in ('share', doc_name, doc_name + '.rst'):
        exclude_patterns.append(d)
        print('ignoring %s' % d)

# Special condition for gnat_rm
if doc_name == 'gnat_rm':
    exclude_patterns.append('share/gnat_project_manager.rst')
    print('ignoring share/gnat_project_manager.rst')

# General information about the project.
master_doc = doc_name
project = DOCS[doc_name]['title']

copyright = get_copyright()

version = get_gnat_version()
release = get_gnat_version()

pygments_style = None
tags.add(get_gnat_build_type())

# Define figures to be included
html_theme = 'sphinx_rtd_theme'
html_theme_options = {
    "style_nav_header_background": "#12284c",
}
if os.path.isfile('adacore-logo-white.png'):
    # split html and pdf logos to avoid 'same name' error in sphinx <5.2+
    html_logo = 'adacore-logo-white.png'
    latex_logo = 'adacore-logo-white.png'
if os.path.isfile('favicon.ico'):
    html_favicon = 'favicon.ico'

html_static_path = ['_static']

# Use gnat.sty for bulding documents
latex_additional_files = ['gnat.sty']

# Add copyright info to file
copyright_macros = {
    'date': time.strftime("%b %d, %Y"),
    'edition': 'GNAT %s Edition' % 'Pro' if get_gnat_build_type() == 'PRO'
               else 'GPL',
    'name': 'GNU Ada',
    'tool': 'GNAT',
    'version': version
}

# Send info to latex for building document
latex_elements = {
    'preamble': '\\usepackage{gnat}\n'  # use gnat.sty format
    + latex_elements.TOC_DEPTH  # define table of contents max depth to display
    + latex_elements.PAGE_BLANK  # define blank pages and when to be used
    + latex_elements.TOC_CMD  # write table of contents
    + latex_elements.LATEX_HYPHEN  # define latex hyphen '-'
    + '\\sloppy\n\n'  # sloppy/fussy define how words are spread in a paragraph
    # the following is used to send title and gnat version to latex
    + latex_elements.doc_settings(DOCS[doc_name]['title'], get_gnat_version()),
    'tableofcontents': latex_elements.TOC % copyright_macros,  # build TOC
    'papersize': 'a4paper,table',  # papersize as a4, else default letter
    'figure_align': 'H',  # align figure as square and to paragraph text
    'maketitle': '\\maketitle',  # execute custom maketitle
}

# Show page references for cross-reference in docs
latex_show_pagerefs = True
# Define latex metadata
latex_documents = [
    (master_doc, '%s.tex' % doc_name, project, 'AdaCore', 'manual')]
# Define .txt files metadata
texinfo_documents = [
    (master_doc, doc_name, project, 'AdaCore', doc_name, doc_name, '')]


# setup AdaCore custom pygments
def setup(app):
    app.add_lexer('ada', ada_pygments.AdaLexer)
    app.add_lexer('gpr', ada_pygments.GNATProjectLexer)