---
- name: Check if azcmagent is installed
  ansible.builtin.command:
    cmd: azcmagent --version
  register: azure_arc_azcmagent_version_cmd
  failed_when: false
  changed_when: false

- name: Set azcmagent installed fact
  ansible.builtin.set_fact:
    azure_arc_azcmagent_installed: "{{ azure_arc_azcmagent_version_cmd.rc == 0 }}"

- name: Create temp directory for azcmagent install script
  when: not azure_arc_azcmagent_installed
  become: true
  ansible.builtin.tempfile:
    state: directory
    suffix: _azure_arc
  register: azure_arc_tmpdir

- name: Set install script path fact
  when: not azure_arc_azcmagent_installed
  ansible.builtin.set_fact:
    azure_arc_azcmagent_install_script_path: "{{ azure_arc_tmpdir.path }}/azcmagent-linux.sh"

- name: Set fact for http/https proxy if defined in proxy variable
  when: azure_arc_proxy_url is defined
  ansible.builtin.set_fact:
    azure_arc_proxy_environment:
      http_proxy: "{{ azure_arc_proxy_url }}"
      https_proxy: "{{ azure_arc_proxy_url }}"

- name: Download azcmagent install script
  when: not azure_arc_azcmagent_installed
  become: true
  ansible.builtin.get_url:
    url: "{{ azure_arc_azcmagent_install_script_url }}"
    dest: "{{ azure_arc_azcmagent_install_script_path }}"
    mode: '0700'
  environment: "{{ azure_arc_proxy_environment | default({}) }}"

- name: Initialize azcmagent install script argv
  when: not azure_arc_azcmagent_installed
  ansible.builtin.set_fact:
    azure_arc_azcmagent_install_script_argv:
      - "/bin/bash"
      - "{{ azure_arc_azcmagent_install_script_path }}"

- name: Add proxy args to azcmagent install script argv
  when:
    - not azure_arc_azcmagent_installed
    - azure_arc_proxy_url is defined
  ansible.builtin.set_fact:
    azure_arc_azcmagent_install_script_argv: "{{ azure_arc_azcmagent_install_script_argv + ['--proxy', azure_arc_proxy_url] }}"

- name: Add desired version args to azcmagent install script argv
  when:
    - not azure_arc_azcmagent_installed
    - azure_arc_desired_version is defined
  ansible.builtin.set_fact:
    azure_arc_azcmagent_install_script_argv: "{{ azure_arc_azcmagent_install_script_argv + ['--desiredversion', azure_arc_desired_version] }}"

- name: Add altdownload args to azcmagent installer argv
  when:
    - not azure_arc_azcmagent_installed
    - azure_arc_altdownload is defined
  ansible.builtin.set_fact:
    azure_arc_azcmagent_install_script_argv: "{{ azure_arc_azcmagent_install_script_argv + ['--altdownload', azure_arc_altdownload] }}"

- name: Run azcmagent install script
  when: not azure_arc_azcmagent_installed
  become: true
  ansible.builtin.command:
    argv: "{{ azure_arc_azcmagent_install_script_argv }}"
  # The install script's log_failure reads these as environment variables, so
  # its failure telemetry is correlated with the rest of this run.
  environment: >-
    {{
      (azure_arc_proxy_environment | default({})) | combine({
        'correlationId': azure_arc_correlation_id,
        'subscriptionId': azure_arc_subscription_id | default(''),
        'resourceGroup': azure_arc_resource_group | default(''),
        'tenantId': azure_arc_tenant_id | default(''),
        'location': azure_arc_location | default(''),
        'cloud': azure_arc_cloud | default('')
      })
    }}
  register: azure_arc_azcmagent_install_cmd
  changed_when: false
  failed_when: azure_arc_azcmagent_install_cmd.rc != 0

- name: Log successful agent installation
  when: not azure_arc_azcmagent_installed
  vars:
    azure_arc_signal_message_type: info
    azure_arc_signal_message: "azcmagent installed successfully via Ansible azure_arc role"
  ansible.builtin.include_tasks: "log_signal.yml"

- name: Remove temp directory for azcmagent install script
  when: not azure_arc_azcmagent_installed
  become: true
  ansible.builtin.file:
    state: absent
    path: "{{ azure_arc_tmpdir.path }}"
