---
- name: "Set up a Matrix server"
  hosts: "{{ target if target is defined else 'matrix_servers' }}"
  become: true

  roles:
    # Most of the roles below are not distributed with the playbook, but downloaded separately using `ansible-galaxy` via the `just roles` command (see `justfile`).
    - role: galaxy/playbook_help
      tags:
        - setup-all
        - install-all

    - role: galaxy/systemd_docker_base

    - role: custom/matrix_playbook_migration

    - when: matrix_playbook_docker_installation_enabled | bool
      role: galaxy/docker
      vars:
        docker_install_compose: false
        docker_install_compose_plugin: false
      tags:
        - setup-docker
        - setup-all
        - install-docker
        - install-all

    - when: devture_docker_sdk_for_python_installation_enabled | bool
      role: galaxy/docker_sdk_for_python
      tags:
        - setup-docker
        - setup-all
        - install-docker
        - install-all

    - when: devture_timesync_installation_enabled | bool
      role: galaxy/timesync
      tags:
        - setup-timesync
        - setup-all
        - install-timesync
        - install-all

    - custom/matrix-base
    - custom/matrix-dynamic-dns
    - galaxy/exim_relay

    - role: galaxy/postgres

    - galaxy/redis
    - galaxy/keydb
    - galaxy/valkey

    - role: custom/matrix-authentication-service
    - custom/matrix-corporal
    - custom/matrix-appservice-draupnir-for-all
    - custom/matrix-appservice-double-puppet
    - custom/matrix-alertmanager-receiver
    - custom/matrix-bridge-appservice-discord
    - custom/matrix-bridge-appservice-slack
    - custom/matrix-bridge-appservice-webhooks
    - custom/matrix-bridge-appservice-irc
    - custom/matrix-bridge-appservice-kakaotalk
    - custom/matrix-bridge-beeper-linkedin
    - custom/matrix-bridge-go-skype-bridge
    - custom/matrix-bridge-wechat
    - custom/matrix-bridge-mautrix-facebook
    - custom/matrix-bridge-mautrix-twitter
    - custom/matrix-bridge-mautrix-hangouts
    - custom/matrix-bridge-mautrix-googlechat
    - custom/matrix-bridge-mautrix-instagram
    - custom/matrix-bridge-mautrix-meta-messenger
    - custom/matrix-bridge-mautrix-meta-instagram
    - custom/matrix-bridge-mautrix-telegram
    - custom/matrix-bridge-mautrix-signal
    - custom/matrix-bridge-mautrix-gmessages
    - custom/matrix-bridge-mautrix-whatsapp
    - custom/matrix-bridge-mautrix-wsproxy
    - custom/matrix-bridge-mautrix-discord
    - custom/matrix-bridge-mautrix-slack
    - custom/matrix-bridge-mx-puppet-discord
    - custom/matrix-bridge-mx-puppet-groupme
    - custom/matrix-bridge-mx-puppet-steam
    - custom/matrix-bridge-mx-puppet-slack
    - custom/matrix-bridge-mx-puppet-twitter
    - custom/matrix-bridge-mx-puppet-instagram
    - custom/matrix-bridge-postmoogle
    - custom/matrix-bridge-sms
    - custom/matrix-bridge-heisenbridge
    - custom/matrix-bridge-hookshot
    - custom/matrix-bot-matrix-reminder-bot
    - custom/matrix-bot-matrix-registration-bot
    - custom/matrix-bot-maubot
    - custom/matrix-bot-buscarron
    - custom/matrix-bot-baibot
    - custom/matrix-bot-honoroit
    - custom/matrix-bot-go-neb
    - custom/matrix-bot-mjolnir
    - custom/matrix-bot-draupnir
    - custom/matrix-bot-chatgpt
    - custom/matrix-cactus-comments
    - custom/matrix-cactus-comments-client
    - custom/matrix-rageshake
    - custom/matrix-synapse
    - custom/matrix-synapse-auto-compressor
    - custom/matrix-synapse-reverse-proxy-companion
    - custom/matrix-dendrite
    - custom/matrix-conduit
    - custom/matrix-synapse-admin
    - custom/matrix-synapse-usage-exporter
    - galaxy/prometheus_node_exporter
    - galaxy/prometheus_postgres_exporter
    - custom/matrix-prometheus-nginxlog-exporter
    - galaxy/prometheus
    - galaxy/grafana
    - custom/matrix-prometheus-services-connect
    - custom/matrix-registration
    - custom/matrix-client-element
    - custom/matrix-client-hydrogen
    - custom/matrix-client-cinny
    - custom/matrix-client-schildichat
    - galaxy/jitsi
    - custom/matrix-user-verification-service
    - custom/matrix-ldap-registration-proxy
    - custom/matrix-ma1sd
    - custom/matrix-dimension
    - galaxy/etherpad
    - custom/matrix-sliding-sync
    - custom/matrix-email2matrix
    - custom/matrix-sygnal
    - galaxy/ntfy
    - custom/matrix-static-files
    - custom/matrix-coturn
    - custom/matrix-media-repo
    - custom/matrix-pantalaimon

    - role: galaxy/postgres_backup

    - role: galaxy/backup_borg

    - custom/matrix-user-creator
    - custom/matrix-common-after

    - role: galaxy/container_socket_proxy

    - role: galaxy/traefik

    - role: galaxy/traefik_certs_dumper

    - role: galaxy/auxiliary

    - when: devture_systemd_service_manager_enabled | bool
      role: galaxy/systemd_service_manager

    # This is pretty much last, because we want it to better serve as a "last known good configuration".
    # See: https://github.com/spantaleev/matrix-docker-ansible-deploy/pull/2217#issuecomment-1301487601
    - when: devture_playbook_state_preserver_enabled | bool
      role: galaxy/playbook_state_preserver
      tags:
        - setup-all
        - install-all

    - role: galaxy/playbook_runtime_messages