---
# roles/custom/matrix-element-call/tasks/install.yml

# Ensure Required Directories Exist
- name: Ensure matrix-element-call paths exist
  ansible.builtin.file:
    path: "{{ item.path }}"
    state: directory
    mode: 0750
    owner: "{{ matrix_user_username }}"
    group: "{{ matrix_user_groupname }}"
  loop:
    - path: "{{ matrix_element_call_base_path }}"
    - path: "{{ matrix_element_call_base_path }}/data"
    - path: "{{ matrix_element_call_base_path }}/config"
    - path: "{{ matrix_element_call_base_path }}/backend"  # For LiveKit and Redis config
    - path: "{{ matrix_base_data_path }}/static-files/public/.well-known/element"  # Directory for element.json

# Ensure Configuration Files are in Place
- name: Ensure Element Call config.json is in place
  ansible.builtin.template:
    src: "{{ role_path }}/templates/config.json.j2"
    dest: "{{ matrix_element_call_base_path }}/config/config.json"
    mode: 0640
    owner: "{{ matrix_user_username }}"
    group: "{{ matrix_user_groupname }}"

- name: Ensure LiveKit livekit.yaml is in place
  ansible.builtin.template:
    src: "{{ role_path }}/templates/livekit.yaml.j2"
    dest: "{{ matrix_element_call_base_path }}/backend/livekit.yaml"
    mode: 0640
    owner: "{{ matrix_user_username }}"
    group: "{{ matrix_user_groupname }}"

- name: Ensure Redis redis.conf is in place
  ansible.builtin.template:
    src: "{{ role_path }}/templates/redis.conf.j2"
    dest: "{{ matrix_element_call_base_path }}/backend/redis.conf"
    mode: 0640
    owner: "{{ matrix_user_username }}"
    group: "{{ matrix_user_groupname }}"

- name: Ensure matrix-element-call environment file is in place
  ansible.builtin.template:
    src: "{{ role_path }}/templates/env.j2"
    dest: "{{ matrix_element_call_base_path }}/config/env"
    mode: 0640
    owner: "{{ matrix_user_username }}"
    group: "{{ matrix_user_groupname }}"

- name: Ensure matrix-element-call Docker labels file is in place
  ansible.builtin.template:
    src: "{{ role_path }}/templates/element-call-labels.j2"
    dest: "{{ matrix_element_call_base_path }}/config/element-call-labels"
    mode: 0640
    owner: "{{ matrix_user_username }}"
    group: "{{ matrix_user_groupname }}"

- name: Ensure LiveKit labels file is in place
  ansible.builtin.template:
    src: "{{ role_path }}/templates/livekit-labels.j2"
    dest: "{{ matrix_element_call_base_path }}/config/livekit-labels"
    mode: 0640
    owner: "{{ matrix_user_username }}"
    group: "{{ matrix_user_groupname }}"

- name: Ensure JWT Service labels file is in place
  ansible.builtin.template:
    src: "{{ role_path }}/templates/jwt-service-labels.j2"
    dest: "{{ matrix_element_call_base_path }}/config/jwt-service-labels"
    mode: 0640
    owner: "{{ matrix_user_username }}"
    group: "{{ matrix_user_groupname }}"

# Ensure Docker Images are Pulled
- name: Ensure matrix-element-call Docker image is pulled
  community.docker.docker_image:
    name: "{{ matrix_element_call_container_image }}"
    source: pull
    force_source: "{{ matrix_element_call_container_image_force_pull }}"
  register: element_call_image_result
  retries: "{{ devture_playbook_help_container_retries_count }}"
  delay: "{{ devture_playbook_help_container_retries_delay }}"
  until: element_call_image_result is not failed

- name: Ensure jwt-service Docker image is pulled
  community.docker.docker_image:
    name: "{{ matrix_jwt_service_image }}"
    source: pull
  register: jwt_image_result
  retries: 3
  delay: 10
  until: jwt_image_result is not failed

- name: Ensure livekit Docker image is pulled
  community.docker.docker_image:
    name: "{{ matrix_livekit_image }}"
    source: pull
  register: livekit_image_result
  retries: 3
  delay: 10
  until: livekit_image_result is not failed

- name: Ensure redis Docker image is pulled
  community.docker.docker_image:
    name: "{{ redis_image }}"
    source: pull
  register: redis_image_result
  retries: 3
  delay: 10
  until: redis_image_result is not failed

# Systemd Services for Element Call, JWT Service, LiveKit, and Redis

- name: Ensure matrix-element-call systemd service is installed
  ansible.builtin.template:
    src: "{{ role_path }}/templates/systemd/matrix-element-call.service.j2"
    dest: "{{ devture_systemd_docker_base_systemd_path }}/matrix-element-call.service"
    mode: 0644

- name: Ensure jwt-service systemd service is installed
  ansible.builtin.template:
    src: "{{ role_path }}/templates/systemd/matrix-jwt-service.service.j2"
    dest: "{{ devture_systemd_docker_base_systemd_path }}/matrix-jwt-service.service"
    mode: 0644

- name: Ensure livekit systemd service is installed
  ansible.builtin.template:
    src: "{{ role_path }}/templates/systemd/matrix-livekit.service.j2"
    dest: "{{ devture_systemd_docker_base_systemd_path }}/matrix-livekit.service"
    mode: 0644

- name: Ensure redis systemd service is installed
  ansible.builtin.template:
    src: "{{ role_path }}/templates/systemd/matrix-redis.service.j2"
    dest: "{{ devture_systemd_docker_base_systemd_path }}/matrix-redis.service"
    mode: 0644

# Update homeserver.yaml for Element Call
- name: Add listeners section for Element Call to homeserver.yaml
  ansible.builtin.blockinfile:
    path: "{{ matrix_homeserver_config_path }}"
    block: |
      listeners:
        - port: 8008
          tls: false
          type: http
          x_forwarded: true
          resources:
            - names: [client, federation, openid]
              compress: false
    marker: "# ANSIBLE MANAGED BLOCK - Element Call listeners"
    mode: '0644'
    owner: "{{ matrix_user_username }}"
    group: "{{ matrix_user_groupname }}"
  when: matrix_element_call_enabled | bool

- name: Ensure serve_server_wellknown is enabled in homeserver.yaml
  ansible.builtin.lineinfile:
    path: "{{ matrix_homeserver_config_path }}"
    line: "serve_server_wellknown: true"
    insertafter: EOF
    state: present
    mode: '0644'
    owner: "{{ matrix_user_username }}"
    group: "{{ matrix_user_groupname }}"
  when: matrix_element_call_enabled | bool

# Update the well-known client file for Element Call (adding RTC FOCI)
- name: Update the existing well-known client file for Element Call (RTC FOCI)
  ansible.builtin.blockinfile:
    path: "{{ matrix_base_data_path }}/static-files/public/.well-known/matrix/client"
    block: |
      "org.matrix.msc4143.rtc_foci": [
        {
          "type": "livekit",
          "livekit_service_url": "{{ matrix_element_call_jwt_service_url }}"
        }
      ]
    marker: "# ANSIBLE MANAGED BLOCK - Element Call RTC FOCI"
    mode: '0644'
    owner: "{{ matrix_user_username }}"
    group: "{{ matrix_user_groupname }}"

# Create .well-known/element/element.json for Element Call
- name: Create the well-known element.json file
  ansible.builtin.template:
    src: "{{ role_path }}/templates/well_known_element.json.j2"
    dest: "{{ matrix_base_data_path }}/static-files/public/.well-known/element/element.json"
    mode: '0644'
    owner: "{{ matrix_user_username }}"
    group: "{{ matrix_user_groupname }}"

# Update Element Web config.json with Element Call settings
- name: Update Element Web config.json
  ansible.builtin.blockinfile:
    path: "{{ element_web_config_path }}"
    block: |
      "features": {
          "feature_video_rooms": true,
          "feature_new_room_decoration_ui": true,
          "feature_group_calls": true,
          "feature_element_call_video_rooms": true
      },
      "element_call": {
          "url": "https://{{ matrix_element_call_domain }}",
          "participant_limit": 8,
          "brand": "Element Call",
          "use_exclusively": true
      }
    marker: "# ANSIBLE MANAGED BLOCK - Element Call settings"
    mode: '0644'
    owner: "{{ matrix_user_username }}"
    group: "{{ matrix_user_groupname }}"