---
- name: Ask user for the input
  hosts: localhost
  tags: always
  vars:
    defaults:
      server_name: algo
      ondemand_cellular: false
      ondemand_wifi: false
      local_dns: false
      ssh_tunneling: false
      windows: false
      store_cakey: false
    providers_map:
      - { name: DigitalOcean, alias: digitalocean }
      - { name: Amazon Lightsail, alias: lightsail }
      - { name: Amazon EC2, alias: ec2 }
      - { name: Vultr, alias: vultr }
      - { name: Microsoft Azure, alias: azure }
      - { name: Google Compute Engine, alias: gce }
      - { name: Scaleway, alias: scaleway}
      - { name: OpenStack (DreamCompute optimised), alias: openstack }
      - { name: Install to existing Ubuntu 18.04 server (Advanced), alias: local }
  vars_files:
    - config.cfg

  tasks:
    - pause:
        prompt: |
          What provider would you like to use?
            {% for p in providers_map %}
            {{ loop.index }}. {{ p['name']}}
            {% endfor %}

          Enter the number of your desired provider
      register: _algo_provider
      when: provider is undefined

    - name: Set facts based on the input
      set_fact:
        algo_provider: "{{ provider | default(providers_map[_algo_provider.user_input|default(omit)|int - 1]['alias']) }}"

    - pause:
        prompt: |
          Name the vpn server
          [algo]
      register: _algo_server_name
      when:
        - server_name is undefined
        - algo_provider != "local"

    - pause:
        prompt: |
          Do you want macOS/iOS clients to enable "VPN On Demand" when connected to cellular networks?
          [y/N]
      register: _ondemand_cellular
      when: ondemand_cellular is undefined

    - pause:
        prompt: |
          Do you want macOS/iOS clients to enable "VPN On Demand" when connected to Wi-Fi?
          [y/N]
      register: _ondemand_wifi
      when: ondemand_wifi is undefined

    - pause:
        prompt: |
          List the names of trusted Wi-Fi networks (if any) that macOS/iOS clients exclude from using the VPN
          (e.g., your home network. Comma-separated value, e.g., HomeNet,OfficeWifi,AlgoWiFi)
      register: _ondemand_wifi_exclude
      when:
        - ondemand_wifi_exclude is undefined
        - (ondemand_wifi|default(false)|bool) or
          (booleans_map[_ondemand_wifi.user_input|default(omit)]|default(false))

    - pause:
        prompt: |
          Do you want to install a DNS resolver on this VPN server, to block ads while surfing?
          [y/N]
      register: _local_dns
      when: local_dns is undefined

    - pause:
        prompt: |
          Do you want each user to have their own account for SSH tunneling?
          [y/N]
      register: _ssh_tunneling
      when: ssh_tunneling is undefined

    - pause:
        prompt: |
          Do you want the VPN to support Windows 10 or Linux Desktop clients? (enables compatible ciphers and key exchange, less secure)
          [y/N]
      register: _windows
      when: windows is undefined

    - pause:
        prompt: |
          Do you want to retain the CA key? (required to add users in the future, but less secure)
          [y/N]
      register: _store_cakey
      when: store_cakey is undefined

    - name: Set facts based on the input
      set_fact:
        algo_server_name: >-
          {% if server_name is defined %}{% set _server = server_name %}
          {%- elif _algo_server_name.user_input is defined and _algo_server_name.user_input != "" %}{% set _server = _algo_server_name.user_input %}
          {%- else %}{% set _server = defaults['server_name'] %}{% endif -%}
          {{ _server | regex_replace('(?!\.)(\W|_)', '-') }}
        algo_ondemand_cellular: >-
          {% if ondemand_cellular is defined %}{{ ondemand_cellular | bool }}
          {%- elif _ondemand_cellular.user_input is defined and _ondemand_cellular.user_input != "" %}{{ booleans_map[_ondemand_cellular.user_input] | default(defaults['ondemand_cellular']) }}
          {%- else %}false{% endif %}
        algo_ondemand_wifi: >-
          {% if ondemand_wifi is defined %}{{ ondemand_wifi | bool }}
          {%- elif _ondemand_wifi.user_input is defined and _ondemand_wifi.user_input != "" %}{{ booleans_map[_ondemand_wifi.user_input] | default(defaults['ondemand_wifi']) }}
          {%- else %}false{% endif %}
        algo_ondemand_wifi_exclude: >-
          {% if ondemand_wifi_exclude is defined %}{{ ondemand_wifi_exclude | b64encode }}
          {%- elif _ondemand_wifi_exclude.user_input is defined and _ondemand_wifi_exclude.user_input != "" %}{{ _ondemand_wifi_exclude.user_input | b64encode }}
          {%- else %}{{ '_null' | b64encode }}{% endif %}
        algo_local_dns: >-
          {% if local_dns is defined %}{{ local_dns | bool }}
          {%- elif _local_dns.user_input is defined and _local_dns.user_input != "" %}{{ booleans_map[_local_dns.user_input] | default(defaults['local_dns']) }}
          {%- else %}false{% endif %}
        algo_ssh_tunneling: >-
          {% if ssh_tunneling is defined %}{{ ssh_tunneling | bool }}
          {%- elif _ssh_tunneling.user_input is defined and _ssh_tunneling.user_input != "" %}{{ booleans_map[_ssh_tunneling.user_input] | default(defaults['ssh_tunneling']) }}
          {%- else %}false{% endif %}
        algo_windows: >-
          {% if windows is defined %}{{ windows | bool }}
          {%- elif _windows.user_input is defined and _windows.user_input != "" %}{{ booleans_map[_windows.user_input] | default(defaults['windows']) }}
          {%- else %}false{% endif %}
        algo_store_cakey: >-
          {% if store_cakey is defined %}{{ store_cakey | bool }}
          {%- elif _store_cakey.user_input is defined and _store_cakey.user_input != "" %}{{ booleans_map[_store_cakey.user_input] | default(defaults['store_cakey']) }}
          {%- else %}false{% endif %}
