# Copyright (c) 2021 Felix Fontein
# Copyright (c) 2020 Markus Bergholz <markuman+spambelongstogoogle@gmail.com>
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later

from __future__ import annotations

DOCUMENTATION = r"""
name: hetzner_dns_records

short_description: Create inventory from Hetzner DNS records

version_added: 2.0.0

description:
  - This plugin allows to create an inventory from Hetzner DNS records.
  - 'For Ansible to be able to identify a YAML file as an inventory for this plugin, the inventory file must contain C(plugin:
    community.dns.hetzner_dns_records) and its filename must end with C(hetzner_dns.yaml) or C(hetzner_dns.yml).'
options:
  plugin:
    description: The name of this plugin. Should always be set to V(community.dns.hetzner_dns_records) for this plugin to
      recognize it as its own.
    required: true
    choices:
      - community.dns.hetzner_dns_records
    type: str

  filters:
    version_added: 3.0.0

extends_documentation_fragment:
  - community.dns._hetzner
  - community.dns._hetzner.plugin
  - community.dns._hetzner.record_type_choices_records_inventory
  - community.dns._hetzner.record_type_seealso
  - community.dns._hetzner.zone_id_type
  - community.dns._inventory_records
  - community.dns._options.record_transformation
  - community.library_inventory_filtering_v1.inventory_filter

notes:
  - The provider-specific O(hetzner_token) option can be templated.
author:
  - Markus Bergholz (@markuman) <markuman+spambelongstogoogle@gmail.com>
  - Felix Fontein (@felixfontein)

seealso:
  - module: community.dns.hetzner_dns_record_set_info
  - module: community.dns.hetzner_dns_record_info
"""

EXAMPLES = r"""
# filename must end with hetzner_dns.yaml or hetzner_dns.yml

plugin: community.dns.hetzner_dns_records
zone_name: domain.de
simple_filters:
  type:
    - TXT
filters:
  - include: >-
      not ansible_host.startswith('v=')
  - exclude: true
txt_transformation: unquoted

# You can also configure the token by putting secret value into this file,
# but this is discouraged. Use a lookup like below, or leave it away and
# set it with the HETZNER_DNS_TOKEN environment variable.
hetzner_token: >-
  {{ (lookup('community.sops.sops', 'keys/hetzner.sops.yml') | from_yaml).hetzner_dns_token }}
"""

import typing as t

from ansible_collections.community.dns.plugins.module_utils._hetzner.api import (
    create_hetzner_api,
    create_hetzner_provider_information,
)
from ansible_collections.community.dns.plugins.module_utils._http import OpenURLHelper
from ansible_collections.community.dns.plugins.plugin_utils._inventory.records import (
    RecordsInventoryModule,
)
from ansible_collections.community.dns.plugins.plugin_utils._templated_options import (
    TemplatedOptionProvider,
)

if t.TYPE_CHECKING:
    from ..module_utils._provider import ProviderInformation  # pragma: no cover
    from ..module_utils._zone_record_api import ZoneRecordAPI  # pragma: no cover
    from ..module_utils._zone_record_set_api import ZoneRecordSetAPI  # pragma: no cover


class InventoryModule(RecordsInventoryModule):
    NAME = "community.dns.hetzner_dns_records"
    VALID_ENDINGS = ("hetzner_dns.yaml", "hetzner_dns.yml")

    def setup_api(self) -> tuple[ProviderInformation, ZoneRecordAPI | ZoneRecordSetAPI]:
        option_provider = TemplatedOptionProvider(self, self.templar)
        provider_information = create_hetzner_provider_information(
            option_provider=option_provider
        )
        return provider_information, create_hetzner_api(
            option_provider, OpenURLHelper()
        )
