---
- name: Ensure XBPS extra repositories directory exists
  tags: [packages]
  ansible.builtin.file:
    path: /etc/xbps.d
    state: directory
    mode: "0755"
  when: (host_xbps_repositories | default([])) | length > 0

- name: Configure host-specific XBPS repositories
  tags: [packages]
  ansible.builtin.copy:
    dest: "/etc/xbps.d/{{ item.name }}.conf"
    content: |
      repository={{ item.url }}
    owner: root
    group: root
    mode: "0644"
  loop: "{{ host_xbps_repositories | default([]) }}"
  loop_control:
    label: "{{ item.name }}"
  register: host_xbps_repository_configs
  when: (host_xbps_repositories | default([])) | length > 0

- name: Install Void nonfree repository if needed
  tags: [packages]
  community.general.xbps:
    name: void-repo-nonfree
    state: present
    update_cache: false
  register: void_nonfree_repository
  when: "'void-repo-nonfree' in (host_packages | default([]) + void_packages_base | default([]))"

- name: Refresh XBPS cache after configuring repositories
  tags: [packages]
  community.general.xbps:
    update_cache: true
    accept_pubkey: true
  when: >-
    (host_xbps_repositories | default([])) | length > 0
    or (void_nonfree_repository is defined and void_nonfree_repository is changed)

- name: Synchronize and upgrade Void Linux packages
  tags: [packages]
  community.general.xbps:
    update_cache: false
    upgrade: true

- name: Install packages on Void Linux
  tags: [packages]
  community.general.xbps:
    name: >-
      {{
        (
          (common_packages | default([]))
        + (void_packages_base | default([]))
        + (profile_packages | default([]))
        + (desktop_common_packages | default([]))
        + (
            (desktop_i3_packages | default([]))
            if 'i3' in (desktop_sessions_enabled | default([]))
            else []
          )
        + (host_packages | default([]))
        )
        | unique
      }}
    state: present
    update_cache: false

- name: Remove host-absent packages on Void Linux
  tags: [packages]
  community.general.xbps:
    name: "{{ host_packages_absent | default([]) }}"
    state: absent
  when: (host_packages_absent | default([])) | length > 0