---
- name: Group for Discourse present
  group:
    name: discourse
    system: yes
    state: present
    gid: 1000

- name: User for Discourse present
  user:
    name: discourse
    system: yes
    state: present
    shell: /bin/bash
    home: /home/discourse
    createhome: true
    groups: discourse,docker
    uid: 1000

- name: Stat /var/discourse/lost+found
  stat:
    path: "/var/discourse/lost+found"
  register: var_discourse_partition

- block:

  - name: Delete lost+found directory if /var/discourse is a partition 
    file:
      dest: /var/discourse/lost+found
      state: absent

  when: var_discourse_partition.stat.exists == True

- name: Directory for Discourse present
  file:
    dest: /var/discourse
    state: directory
    owner: discourse
    group: discourse

- name: ssl-cert group present for UID mappings
  group:
    name: ssl-cert
    system: yes
    state: present
    gid: 111

- name: postgres group present for UID mappings
  group:
    name: postgres
    system: yes
    state: present
    gid: 112

- name: postgres user persent for GID mappings
  user:
    name: postgres
    system: yes
    group: postgres
    createhome: false
    shell: /bin/false
    uid: 107

- name: haproxy group present for UID mappings
  group:
    name: haproxy
    system: yes
    state: present
    gid: 113

- name: haproxy user persent for GID mappings
  user:
    name: haproxy
    system: yes
    group: haproxy
    createhome: false
    shell: /bin/false
    uid: 108

- name: redis group present for UID mappings
  group:
    name: redis
    system: yes
    state: present
    gid: 114

- name: redis user persent for GID mappings
  user:
    name: redis 
    system: yes
    group: redis 
    createhome: false
    shell: /bin/false
    uid: 110

- name: Discourse checked out
  git:
    repo: https://github.com/discourse/discourse_docker.git
    dest: /var/discourse
    update: yes
  become: yes
  become_user: 'discourse' 

- block:

  - name: Create lost+found directory 
    command: mklost+found
    args:
      chdir: /var/discourse
      creates: /var/discourse/lost+found

  when: var_discourse_partition.stat.exists == True

- name: Count how much swap is available
  shell: "free -g --si | awk '/^Swap:/{print $2}'"
  args:
    executable: /bin/bash
  register: swap_space

- debug:
    msg: "There is {{ swap_space.stdout }}GB of swap space"

- name: Fail if less than 2GB of swap is available 
  fail:
    msg: "Please ensure that the server has at least 2G of swap available"
  when: swap_space < 2

- name: 25% of physical memory calculated
  shell: "echo $(( $(free -m | awk '/^Mem:/{print $2}') / 4 ))"
  args:
    executable: /bin/bash
  register: db_shared_buffers

- debug:
    msg: "db_shared_buffers to be set {{ db_shared_buffers.stdout }}MB, which is 25% of physical memory"

- name: Count the CPUs
  command: nproc --all 
  register: cpus

- debug:
    msg: "There are {{ cpus.stdout }} CPUs available"

- name: Count the memory in GB 
  shell: "free -g --si | awk '/^Mem:/{print $2}'"
  args:
    executable: /bin/bash
  register: memory

- debug:
    msg: "There is {{ memory.stdout }}GB of RAM available"

- block:

  - name: Number of Unicorn Workers set to 2 times RAM in GB
    shell: "echo $(( 2 * {{ memory.stdout }} ))"
    args:
      executable: /bin/bash
    register: unicorn_workers
  
  when: memory < 2 

- block:

  - name: Number of Unicorn Workers set to 2 times the number of CPUs 
    shell: "echo $(( 2 * {{ cpus.stdout }} ))"
    args:
      executable: /bin/bash
    register: unicorn_workers

  when: memory >= 2

- debug:
    msg: "Unicorn Workers set to {{ unicorn_workers.stdout }}"

- name: Get the IP address of the server
  command: hostname -i
  register: host_ip

- name: Generate app.yml
  template:
    src: templates/standalone.yml.j2
    dest: /var/discourse/containers/app.yml
  become: yes
  become_user: discourse 

- name: Rebuild Discourse app
  command: /var/discourse/launcher rebuild app
  become: yes
  become_user: discourse 
