# Copyright (c) 2022 VEXXHOST, Inc.
#
# 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.

# -- Path setup --------------------------------------------------------------

# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
# import os
# import sys
# sys.path.insert(0, os.path.abspath('.'))

# -- yaml2rst ----------------------------------------------------------------
import os
import glob
import yaml2rst
from yaml4rst.reformatter import YamlRstReformatter
import pathlib

for defaults_file in glob.glob("../../roles/*/defaults/main.yml"):
    role_name = defaults_file.split("/")[-3]

    YamlRstReformatter._HEADER_END_LINES = {
        'yaml4rst': [
            '# Default variables',
            '#    :local:',
            '# .. contents:: Sections',
            '# .. include:: includes/all.rst',
            '# .. include:: includes/role.rst',
            '# .. include:: ../../../includes/global.rst',
            '# -----------------',
        ],
    }

    reformatter = YamlRstReformatter(
        preset='yaml4rst',
        template_path=os.path.join(
            os.path.abspath(os.path.dirname(__file__)),
            '_templates',
        ),
        config={
            'ansible_full_role_name': f"vexxhost.atmosphere.{role_name}",
            'ansible_role_name': role_name,
        }
    )
    reformatter.read_file(defaults_file)
    reformatter.reformat()
    reformatter.write_file(
        output_file=defaults_file,
        only_if_changed=True,
    )

    pathlib.Path(f"roles/{role_name}/defaults").mkdir(parents=True, exist_ok=True)

    rst_content = yaml2rst.convert_file(
        defaults_file,
        f"roles/{role_name}/defaults/main.rst",
        strip_regex=r'\s*(:?\[{3}|\]{3})\d?$',
        yaml_strip_regex=r'^\s{66,67}#\s\]{3}\d?$',
    )


# -- Project information -----------------------------------------------------

project = 'Atmosphere'
copyright = '2022, VEXXHOST, Inc.'
author = 'VEXXHOST, Inc.'


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

# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
    'reno.sphinxext',
]

# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path.
exclude_patterns = []


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

# The theme to use for HTML and HTML Help pages.  See the documentation for
# a list of builtin themes.
#
html_theme = 'sphinx_rtd_theme'

# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
