---
- name: Ensure dependencies are installed
  pip:
    name:
      - jsondiff
      - pyyaml
      - docker
    state: present
  when: swarm_master is defined and swarm_master

- name: Initialize Docker Swarm
  community.docker.docker_swarm:
    advertise_addr: "{{ warp_ip }}"
    state: present
  when: swarm_master is defined and swarm_master

- name: Check if Docker Swarm Manager is configured
  community.docker.docker_swarm_info:
  ignore_errors: true
  register: swarm_info
  delegate_to: "{%- for host in hostvars -%}
    {%- if hostvars[host].swarm_master is defined and hostvars[host].swarm_master -%}
    {{host}}{%- endif -%}{%- endfor -%}"
  when: swarm_node is defined and swarm_node

- name: Add nodes to the Swarm cluster
  community.docker.docker_swarm:
    state: join
    join_token: "{{ swarm_info.swarm_facts.JoinTokens.Worker }}"
    remote_addrs: [ "{{ warp_ip }}" ]
  when: swarm_node is defined and swarm_node

- name: Ensure /srv/stacks directory exists
  become_user: root
  file:
    path: /srv/stacks
    mode: 0755
    state: directory
    owner: "{{ ansible_user }}"
  when: swarm_master is defined and swarm_master

- name: Ensure Stack files are copied
  copy:
    src: "templates/{{ stack.app_name }}.docker-stack.yml"
    dest: /srv/stacks
    mode: 0644
  loop: "{{ docker_stacks }}"
  loop_control:
    label: "{{ stack.app_name }}"
    loop_var: stack
  when: swarm_master is defined and swarm_master

- name: Ensure Secrets are created
  include_tasks: secrets.yml
  loop: "{{ docker_stacks }}"
  loop_control:
    label: "{{ stack.app_name }}"
    loop_var: stack
  when:
    - swarm_master is defined and swarm_master
    - stack.environment is defined

- name: Ensure Stacks are deloyed
  community.docker.docker_stack:
    name: "{{ stack.app_name }}"
    state: present
    compose:
      - "/srv/stacks/{{ stack.app_name }}.docker-stack.yml"
  loop: "{{ docker_stacks }}"
  loop_control:
    label: "{{ stack.app_name }}"
    loop_var: stack
  when: swarm_master is defined and swarm_master
