"""
Silique (https://www.silique.fr)
Copyright (C) 2024-2026

This program is free software: you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
details.

You should have received a copy of the GNU Lesser General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""

from .i18n import _

try:
    from ..output_doc.config import OutPuts
except:
    OutPuts = None


def get_rougail_config(
    *,
    backward_compatibility=True,
) -> dict:
    if OutPuts:
        doc_outputs = list(OutPuts().get())
        doc_output_format_default = doc_outputs[0]
    else:
        doc_outputs = None
    options = [
        f"""
list:
  description: {_('parameter added only to be compatible with Ansible')}
  default: false
  disabled:
    jinja: |-
      {{{{ step.output is propertyerror or step.output != 'ansible' }}}}
    return_type: boolean
    description: {_('if ansible is not set in "step.output"')}
""",
        f"""
ansible:
  exists: true
  redefine: true
  description: {_('Load Ansible encrypt inventory or generate Ansible inventory')}
  disabled:
    jinja: |-
      {{{{ step.output is propertyerror or (step.output != 'ansible' and (step.user_data is propertyerror or 'ansible' not in step.user_data)) }}}}
    return_type: boolean
    description: {_('if ansible is not in "step.output" and not in "step.user_data"')}

""",
        f"""
ansible:
  type: family
  description: {_('Generate Ansible inventory')}
  exists: false
  disabled:
    variable: step.output
    when_not: ansible
    propertyerror: false

""",
        f"""
ansible:

  output:
    description: {_('Output type')}
    default: inventory
    choices:
      - inventory
""",
    ]
    if doc_outputs:
        options[
            -1
        ] += f"""
      - doc

  host_namespace: hosts  # {_('Namespace with host values')}

  doc:
    description: {_("Doc configuration")}
    disabled:
      variable: _.output
      when_not: doc

    project_name:  # {_('Ansible project name')}

    author:  # {_('Ansible author name')}

    output_format:
      description: {_('The output format of the generated documentation')}
      default: { doc_output_format_default }
      choices:
"""
    for output in doc_outputs:
        options[-1] += f"        - {output}\n"
    options[
        -1
    ] += f"""
    collection_type:
      description: {_('collection contents')}
      choices:
        - auto
        - playbooks
        - roles
      default: auto

    playbooks:
      _description: {_('Playbooks informations')}
      type: sequence
      disabled:
        jinja: |-
          {{{{ _.collection_type == "roles" }}}}
        return_type: boolean
        description: {_('if the content is a role')}

      name:
        description: {_('Playbook name')}
        help: {_('Playbooks are placed in the playbooks/ directory. By default, the description of the "type" is used as the Playbook name in the generated example. It is possible to customize this description here.')}
        mandatory: false
        multi: true

      description: # {_('Playbook description')}

    root_directory:
      description: {_('Root directory of generated documents')}
      type: unix_filename
      params:
        allow_relative: true
        test_existence: true
        types:
          - directory
      mandatory: false

    extra_vars:
      description: {_('Add extra vars inside Playbook or Role')}
      type: sequence

      key:
        description: {_('Key name')}
        mandatory: false

      value:  # {_('Value')}

  inventory:
    description: {_("Inventory configuration")}
    disabled:
      variable: _.output
      when_not: inventory

    no_namespace_in_vars: false  # {_('Remove namespace name in host vars')}

    export_warnings: true  # {_('Displays warnings inside Ansible exportation datas')}
"""
    return {
        "name": "ansible",
        "process": "output",
        "options": options,
        "level": 60,
    }


__all__ = ("get_rougail_config",)
