---
############################################################
# 1. Infrastruktur erstellen
############################################################

- name: Provision infrastructure in Hetzner Cloud
  hosts: localhost
  gather_facts: true

  vars:
    base_name: ansible-demo
    ssh_key_name: ansible-key

  tasks:

    - name: Set unique server name (timestamp based)
      set_fact:
        server_name: "{{ base_name }}-{{ ansible_date_time.epoch }}"

    - name: Show calculated server name
      debug:
        var: server_name

    - name: Create SSH key in Hetzner
      hetzner.hcloud.hcloud_ssh_key:
        api_token: "{{ hcloud_token }}"
        name: "{{ ssh_key_name }}"
        public_key: "{{ hcloud_ssh_public_key }}"
        state: present

    - name: Create Hetzner Cloud Server
      hetzner.hcloud.hcloud_server:
        api_token: "{{ hcloud_token }}"
        name: "{{ server_name }}"
        server_type: "{{ hcloud_server_type }}"
        image: "{{ hcloud_image }}"
        location: "{{ hcloud_location }}"
        ssh_keys:
          - "{{ ssh_key_name }}"
        firewalls: "{{ hcloud_firewalls | default(omit) }}"
        state: present
      register: created_server

    - name: Store server info in Supabase
      ansible.builtin.uri:
        url: "{{ supabase_url }}/rest/v1/servers"
        method: POST
        headers:
          apikey: "{{ supabase_api_key }}"
          Authorization: "Bearer {{ supabase_api_key }}"
          Content-Type: "application/json"
          Prefer: "resolution=merge-duplicates"
        body_format: json
        body:
          server_id: "{{ created_server.hcloud_server.id }}"
          name: "{{ created_server.hcloud_server.name }}"
          ipv4: "{{ created_server.hcloud_server.ipv4_address }}"
          server_type: "{{ created_server.hcloud_server.server_type }}"
          location: "{{ created_server.hcloud_server.location }}"
          status: "{{ created_server.hcloud_server.status }}"
        status_code: [200, 201]
      delegate_to: localhost

    - name: Add new server to runtime inventory
      add_host:
        name: newserver
        ansible_host: "{{ created_server.hcloud_server.ipv4_address }}"
        ansible_user: root
        ansible_ssh_private_key_file: "~/.ssh/id_ed25519"

    - name: Wait for SSH to become reachable
      wait_for:
        host: "{{ created_server.hcloud_server.ipv4_address }}"
        port: 22
        delay: 5
        timeout: 180
        state: started


############################################################
# 2. Server konfigurieren
############################################################

- name: Configure new server
  hosts: newserver
  become: true
  gather_facts: true

  vars:
    new_username: sysadmin46E9

  tasks:

    - name: Create sudo user
      ansible.builtin.user:
        name: "{{ new_username }}"
        shell: /bin/bash
        groups: sudo
        append: yes
        create_home: yes

    - name: Add SSH key for user
      ansible.posix.authorized_key:
        user: "{{ new_username }}"
        key: "{{ lookup('file', '~/.ssh/id_ed25519.pub') }}"

    - name: Allow passwordless sudo
      ansible.builtin.copy:
        dest: "/etc/sudoers.d/{{ new_username }}"
        content: "{{ new_username }} ALL=(ALL) NOPASSWD:ALL"
        mode: '0440'

