#!/usr/bin/python
# coding: utf-8 -*-

# Copyright (c) 2020, {{ author_name }} <{{ author_mail }}>
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)

DOCUMENTATION = '''
---
module: {{ module_name }}
short_description: {{ module_short_description }}
author: OpenStack Ansible SIG
description:
  - {{ module_long_description }}
options:
  {{ options|to_nice_yaml(indent=2,sort_keys=false)|indent(width=2)|trim }}

requirements:
  - "python >= 3.6"
  - "openstacksdk"

extends_documentation_fragment:
  - openstack.cloud.openstack
'''

RETURN = '''
{{ module_returns_example|to_nice_yaml(indent=2,sort_keys=false) }}
'''

EXAMPLES = '''
# What modules does for example
- {{ module_name }}:
    name:
      - name1
      - name2
    timeout: 200
'''

from ansible_collections.openstack.cloud.plugins.module_utils.openstack import OpenStackModule


class {{ module_name.split("_")|map("capitalize")|list|join("") }}Module(OpenStackModule):

    argument_spec = dict(
{% for k, v in options.items() %}
{{ k | indent( width=8, indentfirst=True) }}=dict(type='{{ v.type }}'
{%- if 'required' in v %}, required={{ v.required }}{% endif %}
{%- if 'elements' in v %}, elements={{ v.elements }}{% endif %}
{%- if 'default' in v %}, default={% if v.type == 'str' %}"{{ v.default }}"{% else %}{{ v.default }}{% endif %}{% endif %}
{%- if 'aliases' in v %}, aliases={{ v.aliases }}{% endif %}
{%- if 'choices' in v %}, choices={{ v.choices }}{% endif %}),
{% endfor %}
    ),

    # Optional arguments requirements
    module_kwargs = dict(
        required_if=[
            ['action', 'rebuild', ['image']],  # if need to rebuild image (only), the 'image' is required
            ["state", "present", ["username", "user_roles"]],  # for creating user 'user_roles' is required
            ["state", "absent", ["username"]],  # for state 'absent' only username is required
        ],
        required_by=dict(  # for weather and population 'city' is required to set
            weather=('city'),
            population=('city'),
        ),
        mutually_exclusive=[
            ['use_cloud1', 'use_cloud2']  # can't run on both, choose only one to set
        ],
        required_together=[
            ['remove_image', 'image_name']  # if need to remove image, must to specify which one
        ],
        required_one_of_args=[["password", "password_hash"]],  # one of these args must be set
        supports_check_mode={{ check_mode_support }},  # good practice is to support check_mode
    )

    # you main funciton is here
    def run(self):
        # do any arguments check if needed
        data = self.preliminary_checks()
        # check if we need to prepare various filters for results
        filters = self.prepare_filters()
        # run SDK call to get information about requested resource
        result = self.conn.compute.resource_list(
            filters=filters,
            detailed=self.params['detailed'],
            # any other parameters
            )
        # process results if they require a change
        result = self.normalize_result()
        self.results.update({'resource_name': result})

    def preliminary_checks(self):
        # you checks before running like arguments and options checks, etc
        return data

    def prepare_filters(self):
        # process filters if they require additional checks
        return filters

    def normalize_result(self):
        # process filters if they require additional checks
        return result


def main():
    module = {{ module_name.split("_")|map("capitalize")|list|join("") }}Module()
    module()


if __name__ == '__main__':
    main()