---

# We used to store Postgres data directly under `/matrix/postgres` (what is now considered `matrix_postgres_base_path`).
#
# From now on, we expect to store Postgres data one directory below now (`/matrix/postgres/data` - `matrix_postgres_data_path`).
# We wish to use the base directory for other purposes (storing environment variable files, etc.).
# Mixing those with the Postgres data is no good and it leads to Postgres's `initdb` complaining to initialize
# a database in a non-empty directory.
#
# For this reason, we store the Postgres data in `/matrix/postgres/data` and need to relocate any installations
# which still store it in the parent directory (`/matrix/postgres`).
#
# This utility is intentionally not in `tasks/util`, because if it were, it wouldn't be possible
# to include it in other roles via the import_role module: https://docs.ansible.com/ansible/latest/collections/ansible/builtin/import_role_module.html

- name: Check if old Postgres data directory is used
  ansible.builtin.stat:
    path: "{{ matrix_postgres_base_path }}/PG_VERSION"
  register: result_pg_old_data_dir_stat

- name: Warn if old Postgres data directory detected
  ansible.builtin.debug:
    msg: >
      Found that you have Postgres data in `{{ matrix_postgres_base_path }}`.
      From now on, Postgres data is supposed to be stored in `{{ matrix_postgres_data_path }}` instead.
      We'll stop Postgres and relocate the files there for you.
  when: "result_pg_old_data_dir_stat.stat.exists"

# We should stop Postgres first, before building a list of files,
# as to ignore any `postmaster.pid` files, etc.
- name: Ensure matrix-postgres is stopped
  ansible.builtin.service:
    name: matrix-postgres
    state: stopped
    daemon_reload: true
  when: "result_pg_old_data_dir_stat.stat.exists"

- name: Find files and directories in old Postgres data path
  ansible.builtin.find:
    paths: "{{ matrix_postgres_base_path }}"
    file_type: any
    excludes: ["data"]
  register: "result_pg_old_data_dir_find"
  when: "result_pg_old_data_dir_stat.stat.exists"

- name: Ensure new Postgres data path exists
  ansible.builtin.file:
    path: "{{ matrix_postgres_data_path }}"
    state: directory
    mode: 0700
    owner: "{{ matrix_user_username }}"
    group: "{{ matrix_user_groupname }}"
  when: "result_pg_old_data_dir_stat.stat.exists"

- when: "result_pg_old_data_dir_stat.stat.exists"
  block:
    - name: Relocate Postgres data files from old directory to new
      ansible.builtin.command:
        cmd: "mv {{ item.path }} {{ matrix_postgres_data_path }}/{{ item.path | basename }}"
      with_items: "{{ result_pg_old_data_dir_find.files }}"
      register: matrix_postgres_migrate_postgres_data_directory_move_result
      changed_when: matrix_postgres_migrate_postgres_data_directory_move_result.rc == 0

# Intentionally not starting matrix-postgres here.
# It likely needs to be updated to point to the new directory.
# In fact, let's even get rid of the outdated service, to ensure no one will start it
# and have it initialize a new database.

- name: Ensure outdated matrix-postgres.service doesn't exist
  ansible.builtin.file:
    path: "{{ devture_systemd_docker_base_systemd_path }}/matrix-postgres.service"
    state: absent
  when: "result_pg_old_data_dir_stat.stat.exists"

- name: Ensure systemd reloaded after getting rid of outdated matrix-postgres.service
  ansible.builtin.service:
    daemon_reload: true
  when: "result_pg_old_data_dir_stat.stat.exists"
