---
- name: Inform what is going on
  pause:
    prompt: |-
      *************************************************************************************
      Checking if {{ item.name }} needs to be processed...
      *************************************************************************************
    seconds: 0

- name: Get download confirmation code from Google Drive
  uri:
    url: "https://drive.google.com/uc?export=download&id={{ item.file_id }}"
    creates: "{{ ansible_facts['user_dir'] }}/Downloads/{{ item.name }}"
    return_content: yes
    status_code: 200
  register: dl_cc
  when:
    - item.file_id is defined
    - not (item.direct_download | default(true))

- name: Store conf code as a fact
  set_fact:
    src_url: "{{ dl_cc.content | regex_replace('^.*action=\"', '') | regex_replace('\".*$', '') | regex_replace('amp;', '') }}"
  when: dl_cc.content is defined

- name: Store direct URL as a fact
  set_fact:
    src_url: "https://drive.google.com/uc?export=download&id={{ item.file_id }}"
  when:
    - item.file_id is defined
    - dl_cc.content is not defined
    - item.direct_download | default(true)

- name: Use dict url field as src_url
  set_fact:
    src_url: "{{ item.url }}"
  when:
    - item.url is defined

- name: Check if the target is already there
  ansible.builtin.stat:
    path: "{{ item.target_path }}"
  register: target_stat
  when: item.target_path is defined

- name: Download the file
  get_url:
    url: "{{ src_url }}"
    dest: "{{ ansible_facts['user_dir'] }}/Downloads/{{ item.name }}"
    mode: 0664
    timeout: 30
    checksum: "{{ item.checksum | default('') }}"
  when:
    - (src_url | default(None)) != None
    - item.target_path is not defined or (target_stat.stat is defined and not target_stat.stat.exists)
  register: downloaded

# TODO: fix permissions on target dir (s2i /usr/local/bin)
- name: Extract if so required
  become: yes
  unarchive:
    src: "{{ ansible_facts['user_dir'] }}/Downloads/{{ item.name }}"
    remote_src: yes
    creates: "{{ item.extracted_dir | default(item.target_path) }}"
    dest: "{{ item.extract_to | default('/') }}"
  register: extract_action
  when:
    - item.extract_to is defined
    - downloaded.changed

- name: reset permissions if needed
  become: yes
  file:
    path: "{{ item.extract_to }}"
    mode: "{{ item.extract_fix_perms }}"
  when:
    - item.extract_fix_perms is defined
    - item.extract_to is defined

- name: Rename wherever the archive extracted to whatever new name is required, if so
  become: yes
  command: mv {{ item.extracted_dir }} {{ item.target_path }}
  when:
    - item.extracted_dir is defined
    - item.target_path is defined
    - extract_action is defined
    - extract_action.changed

- name: Make sure bin is in PATH
  lineinfile:
    path: "{{ ansible_facts['user_dir'] }}/.bashrc"
    line: 'PATH="${PATH}:{{ item.target_path | default(item.extracted_dir) }}/bin"'
    regexp: '^PATH=.*{{ item.target_path | default(item.extracted_dir) }}/bin'
    insertafter: "^# User specific environment$"
    state: present
  when:
    - item.add_to_path is defined
    - item.add_to_path
    - item.extracted_dir is defined

- name: Remove after finished if so required
  file:
    path: "{{ ansible_facts['user_dir'] }}/Downloads/{{ item.name }}"
    state: absent
  when:
    - item.remove_after is defined
    - item.remove_after

- name: reset facts
  set_fact:
    dl_cc: !!null
    src_url: !!null
    target_stat: !!null
    downloaded: !!null
    extract_action: !!null
...