# @NOTE run 'ansible-playbook' command on this using 'sudo'
- name: Initialize VPS
  hosts: "{{ chosen_host | default('staging0.test') }}"
  remote_user: "{{ chosen_user | default('root') }}"
  vars:
    harden: true
  vars_files:
    - vars/local_facts.yml # REQUIRED
    - vars/vpn_settings.yml # REQUIRED
    - vars/wireguard_settings.yml # REQUIRED
    - vars/headscale_settings.yml # REQUIRED
    - vars/podpose_settings.yml # REQUIRED
    - vars/certbot_settings@vps.yml # REQUIRED
    - vars/users@{{ inventory_hostname | default('vps') }}.yml
    - vars/config@{{ inventory_hostname | default('vps') }}.yml
  tasks:
    - name: Hardening SSH server
      ansible.builtin.include_role:
        name: init-server  # required. The name of the role to be executed.
        # apply:  # not required. Accepts a hash of task keywords (e.g. C(tags), C(become)) that will be applied to all tasks within the included role.
        tasks_from: harden # not required. File to load from a role's C(tasks/) directory.
        # vars_from: main # not required. File to load from a role's C(vars/) directory.
        # defaults_from: main # not required. File to load from a role's C(defaults/) directory.
        # allow_duplicates: True # not required. Overrides the role's metadata setting to allow using a role more than once with the same parameters.
        # handlers_from: main # not required. File to load from a role's C(handlers/) directory.
    - name: Installing requisite packages
      ansible.builtin.include_role:
        name: init-server
        tasks_from: core@install-pkgs
        handlers_from: core
    - name: Initializing groups and users
      ansible.builtin.include_role:
        name: init-server
        tasks_from: ssh-users
    - name: Flushing handlers
      ansible.builtin.meta: flush_handlers
    - name: Updating hostname
      become: true
      ansible.builtin.hostname:
        name: "{{ inventory_hostname }}"
    - name: Updating hosts file
      become: true
      ansible.builtin.lineinfile:
        path: /etc/hosts
        regexp: "^127\\.0\\.1\\.1"
        line: "127.0.1.1  {{ inventory_hostname }}"
        insertbefore: BOF
        state: present
    - name: Updating host icon name
      become: true
      ansible.builtin.command:
        cmd: "hostnamectl set-icon-name computer-server"
    - name: Opening port 51820
      become: true
      ansible.builtin.iptables:
        chain: INPUT
        protocol: "{{ item }}"
        destination_port: 51820
        jump: ACCEPT
        comment: Open up port 51820
      loop:
        - udp
        - tcp
    - name: Opening port 443
      become: true
      ansible.builtin.iptables:
        chain: INPUT
        protocol: "{{ item }}"
        destination_port: 443
        jump: ACCEPT
        comment: Open up port 443
      loop:
        - udp
        - tcp
    - name: Opening ports
      become: true
      ansible.builtin.iptables:
        chain: INPUT
        protocol: tcp
        destination_port: "{{ item }}"
        jump: ACCEPT
        comment: "Open up port {{ (item | string) }}"
      loop:
        - 80
        - 465
        - 587
        - 995
        - 993
    - name: Notifying user that all processes have finished
      ansible.builtin.debug:
        msg: All processes finished. Hit enter to reboot machine.
    - name: Ensuring user has read prior message regarding upcoming reboot
      ansible.builtin.pause:
    - name: Rebooting machine for hostname change
      become: true
      ansible.builtin.reboot:
        msg: "Rebooting machine.."
        connect_timeout: 0
        test_command: ~