---
- block:
  - name: download_file | Starting download of file
    debug:
      msg: "{{ download.url }}"
    run_once: "{{ download_run_once }}"

  - name: download_file | Set pathname of cached file
    set_fact:
      file_path_cached: "{{ download_cache_dir }}/{{ download.dest | basename }}"
    tags:
    - facts

  - name: download_file | Create dest directory on node
    file:
      path: "{{ download.dest | dirname }}"
      owner: "{{ download.owner | default(omit) }}"
      mode: 0755
      state: directory
      recurse: yes

  - name: download_file | Create local cache directory
    file:
      path: "{{ file_path_cached | dirname }}"
      state: directory
      recurse: yes
    delegate_to: localhost
    connection: local
    delegate_facts: false
    run_once: true
    become: false
    when:
    - download_force_cache
    - download_localhost
    tags:
    - localhost

  - name: download_file | Create cache directory on download_delegate host
    file:
      path: "{{ file_path_cached | dirname }}"
      state: directory
      recurse: yes
    delegate_to: "{{ download_delegate }}"
    delegate_facts: false
    run_once: true
    when:
    - download_force_cache
    - not download_localhost

  # This must always be called, to check if the checksum matches. On no-match the file is re-downloaded.
  - name: download_file | Download item
    get_url:
      url: "{{ download.url }}"
      dest: "{{ file_path_cached if download_force_cache else download.dest }}"
      owner: "{{ omit if download_localhost else (download.owner | default(omit)) }}"
      mode: "{{ omit if download_localhost else (download.mode | default(omit)) }}"
      checksum: "{{ 'sha256:' + download.sha256 if download.sha256 else omit }}"
      validate_certs: "{{ download_validate_certs }}"
      url_username: "{{ download.username | default(omit) }}"
      url_password: "{{ download.password | default(omit) }}"
      force_basic_auth: "{{ download.force_basic_auth | default(omit) }}"
    delegate_to: "{{ download_delegate if download_force_cache else inventory_hostname }}"
    run_once: "{{ download_force_cache }}"
    register: get_url_result
    become: "{{ not download_localhost }}"
    until: "'OK' in get_url_result.msg or 'file already exists' in get_url_result.msg"
    retries: 4
    delay: "{{ retry_stagger | default(5) }}"

  - name: download_file | Copy file back to ansible host file cache
    synchronize:
      src: "{{ file_path_cached }}"
      dest: "{{ file_path_cached }}"
      use_ssh_args: "{{ has_bastion | default(false) }}"
      mode: pull
    when:
    - download_force_cache
    - not download_localhost
    - download_delegate == inventory_hostname

  - name: download_file | Copy file from cache to nodes, if it is available
    synchronize:
      src: "{{ file_path_cached }}"
      dest: "{{ download.dest }}"
      use_ssh_args: "{{ has_bastion | default(false) }}"
      mode: push
    register: get_task
    until: get_task is succeeded
    delay: "{{ retry_stagger | random + 3 }}"
    retries: 4
    when:
    - download_force_cache

  - name: download_file | Set mode and owner
    file:
      path: "{{ download.dest }}"
      mode: "{{ download.mode | default(omit) }}"
      owner: "{{ download.owner | default(omit) }}"
    when:
    - download_force_cache

  - name: "download_file | Extract file archives"
    include_tasks: "extract_file.yml"

  tags:
  - download
