---
- name: Algo VPN Setup
  hosts: localhost
  become: false
  tasks:
    - name: Playbook dir stat
      stat:
        path: "{{ playbook_dir }}"
      register: _playbook_dir

    - name: Ensure Ansible is not being run in a world writable directory
      assert:
        that: _playbook_dir.stat.mode|int <= 775
        msg: >
          Ansible is being run in a world writable directory ({{ playbook_dir }}), ignoring it as an ansible.cfg source.
          For more information see https://docs.ansible.com/ansible/devel/reference_appendices/config.html#cfg-in-world-writable-dir

    - name: Ensure the requirements installed
      debug:
        msg: "{{ '192.168.1.1' | ansible.utils.ipaddr }}"
      ignore_errors: true
      no_log: true
      register: ipaddr

    - name: Extract ansible version from pyproject.toml
      set_fact:
        ansible_requirement: "{{ lookup('file', 'pyproject.toml') | regex_search('ansible==[0-9]+\\.[0-9]+\\.[0-9]+') }}"

    - name: Parse ansible version requirement
      set_fact:
        required_ansible_version:
          op: "{{ ansible_requirement | regex_replace('^ansible\\s*([~>=<]+)\\s*.*$', '\\1') }}"
          ver: "{{ ansible_requirement | regex_replace('^ansible\\s*[~>=<]+\\s*(\\d+\\.\\d+(?:\\.\\d+)?).*$', '\\1') }}"
      when: ansible_requirement is defined

    - name: Get current ansible package version
      command: uv pip list
      register: uv_package_list
      changed_when: false

    - name: Extract ansible version from uv package list
      set_fact:
        current_ansible_version: "{{ uv_package_list.stdout | regex_search('ansible\\s+([0-9]+\\.[0-9]+\\.[0-9]+)', '\\1') | first }}"

    - name: Verify Python meets Algo VPN requirements
      assert:
        that: (ansible_python.version.major|string + '.' + ansible_python.version.minor|string) is version('3.11', '>=')
        msg: >
          Python version is not supported.
          You must upgrade to at least Python 3.11 to use this version of Algo.
          See for more details - https://trailofbits.github.io/algo/troubleshooting.html#python-version-is-not-supported

    - name: Verify Ansible meets Algo VPN requirements
      assert:
        that:
          - current_ansible_version is version(required_ansible_version.ver, required_ansible_version.op)
          - not ipaddr.failed
        msg: >
          Ansible version is {{ current_ansible_version }}.
          You must update the requirements to use this version of Algo.
          Try to run: uv sync

- name: Include prompts playbook
  import_playbook: input.yml

- name: Include cloud provisioning playbook
  import_playbook: cloud.yml

- name: Include server configuration playbook
  import_playbook: server.yml
