---

# Pre-checks

- name: Fail if Postgres not enabled
  fail:
    msg: "Postgres via the matrix-postgres role is not enabled (`matrix_postgres_enabled`). Cannot import."
  when: "not matrix_postgres_enabled|bool"

- name: Fail if playbook called incorrectly
  fail:
    msg: "The `server_path_homeserver_db` variable needs to be provided to this playbook, via --extra-vars"
  when: "server_path_homeserver_db is not defined or server_path_homeserver_db.startswith('<')"

- name: Check if the provided SQLite homeserver.db file exists
  stat:
    path: "{{ server_path_homeserver_db }}"
  register: result_server_path_homeserver_db_stat

- name: Fail if provided SQLite homeserver.db file doesn't exist
  fail:
    msg: "File cannot be found on the server at {{ server_path_homeserver_db }}"
  when: "not result_server_path_homeserver_db_stat.stat.exists"


# Defaults

- name: Set postgres_start_wait_time, if not provided
  set_fact:
    postgres_start_wait_time: 15
  when: "postgres_start_wait_time|default('') == ''"


# Actual import work

- name: Ensure matrix-postgres is stopped
  service:
    name: matrix-postgres
    state: stopped
    daemon_reload: yes

- name: Ensure postgres data is wiped out
  file:
    path: "{{ matrix_postgres_data_path }}"
    state: absent

- name: Ensure postgres data path exists
  file:
    path: "{{ matrix_postgres_data_path }}"
    state: directory
    mode: 0700
    owner: "{{ matrix_user_username }}"
    group: "{{ matrix_user_groupname }}"

- name: Ensure matrix-postgres is started
  service:
    name: matrix-postgres
    state: restarted
    daemon_reload: yes

- name: Wait a bit, so that Postgres can start
  wait_for:
    timeout: "{{ postgres_start_wait_time }}"
  delegate_to: 127.0.0.1
  become: false

# We don't use the `docker_container` module, because using it with `cap_drop` requires
# a very recent version, which is not available for a lot of people yet.
#
# Also, some old `docker_container` versions were buggy and would leave containers behind
# on failure, which we had to work around to allow retries (by re-running the playbook).
- name: Import SQLite database into Postgres
  command: |
    docker run
    --rm
    --name=matrix-synapse-migrate
    --log-driver=none
    --user={{ matrix_user_uid }}:{{ matrix_user_gid }}
    --cap-drop=ALL
    --network={{ matrix_docker_network }}
    --entrypoint=python
    --mount type=bind,src={{ matrix_synapse_config_dir_path }},dst=/data
    --mount type=bind,src={{ matrix_synapse_config_dir_path }},dst=/matrix-media-store-parent/media-store
    --mount type=bind,src={{ server_path_homeserver_db }},dst=/{{ server_path_homeserver_db|basename }}
    {{ matrix_synapse_docker_image }}
    /usr/local/bin/synapse_port_db --sqlite-database /{{ server_path_homeserver_db|basename }} --postgres-config /data/homeserver.yaml