---
- hosts: localhost
  gather_facts: False
  tags: always
  vars_files:
    - config.cfg

  tasks:
    - block:
        - name: Get list of installed config files
          find:
            paths: configs/
            depth: 2
            recurse: true
            hidden: true
            patterns: ".config.yml"
          register: _configs_list

        - name: Verify servers
          assert:
            that: _configs_list.matched > 0
            msg: No servers found, nothing to update.

        - name: Build list of installed servers
          set_fact:
            server_list: >-
              [{% for i in _configs_list.files %}
                {% set config  = lookup('file', i.path)|from_yaml %}
                '{{ config.server }}'
                {{ ',' if not loop.last else '' }}
              {% endfor %}]

        - name: Server address prompt
          pause:
            prompt: |
              Select the server to update user list below:
                {% for r in server_list %}
                {{ loop.index }}. {{ r }}
                {% endfor %}
          register: _server
      when: server is undefined

    - block:
        - name: Set facts based on the input
          set_fact:
            algo_server: >-
              {% if server is defined %}{{ server }}
              {%- elif _server.user_input %}{{ server_list[_server.user_input | int -1 ] }}
              {%- else %}omit{% endif %}

        - name: Import host specific variables
          include_vars:
            file: "configs/{{ algo_server }}/.config.yml"

        - when: ipsec_enabled
          block:
          - name: CA password prompt
            pause:
              prompt: Enter the password for the private CA key
              echo: false
            register: _ca_password
            when: ca_password is undefined

          - name: Set facts based on the input
            set_fact:
              CA_password: >-
                {% if ca_password is defined %}{{ ca_password }}
                {%- elif _ca_password.user_input %}{{ _ca_password.user_input }}
                {%- else %}omit{% endif %}

        - name: Local pre-tasks
          import_tasks: playbooks/cloud-pre.yml
          become: false

        - name: Add the server to the vpn-host group
          add_host:
            name: "{{ algo_server }}"
            groups: vpn-host
            ansible_ssh_user: "{{ server_user|default('root') }}"
            ansible_connection: "{% if algo_server == 'localhost' %}local{% else %}ssh{% endif %}"
            ansible_python_interpreter: "/usr/bin/python3"
            CA_password: "{{ CA_password|default(omit) }}"
      rescue:
        - include_tasks: playbooks/rescue.yml

- name: User management
  hosts: vpn-host
  gather_facts: true
  become: true
  vars_files:
    - config.cfg
    - "configs/{{ inventory_hostname }}/.config.yml"

  tasks:
    - block:
      - import_role:
          name: common

      - import_role:
          name: wireguard
        when: wireguard_enabled

      - import_role:
          name: strongswan
        when: ipsec_enabled
        tags: ipsec

      - import_role:
          name: ssh_tunneling
        when: algo_ssh_tunneling

      - debug:
          msg:
            - "{{ congrats.common.split('\n') }}"
            - "    {{ congrats.p12_pass if algo_ssh_tunneling or ipsec_enabled else '' }}"
            - "    {{ congrats.ca_key_pass if algo_store_pki and ipsec_enabled else '' }}"
            - "    {{ congrats.ssh_access if algo_provider != 'local' else ''}}"
        tags: always
      rescue:
        - include_tasks: playbooks/rescue.yml
