#!/bin/bash
set -o errexit -o pipefail -o noclobber -o nounset -o errtrace -o functrace

shopt -s dotglob

quadlet_template="
    - path: /home/__USER__/.config/containers/systemd/__FILE__
      mode: 0644
      contents:
        local: quadlets/__USER__/__FILE__
      user:
        name: __USER__
      group:
        name: __USER__"
home_template="
    - path: /var/home/__USER__/__FILE__
      mode: 0755
      contents:
        local: home/__USER__/__FILE__
      user:
        name: __USER__
      group:
        name: __USER__"
service_template="
    - path: /var/home/__USER__/.config/systemd/user/__FILE__
      mode: 0755
      contents:
        local: services/__USER__/__FILE__
      user:
        name: __USER__
      group:
        name: __USER__"
directory_template="
    - path: /var/mnt/nas/containers/__USER__/storage/__VOLUME__
      mode: 0755
      user:
        name: __USER__
      group:
        name: __USER__"
files_template="
  files:
    - path: /var/lib/systemd/linger/__USER__
      mode: 0644"
users=('arr' 'gitea' 'homeassistant' 'immich' 'jdownloader' 'kiwix' 'komga' 'navidrome' 'nextcloud' 'nginx' 'overleaf' 'pairdrop' 'paperless' 'pihole' 'qbittorrent' 'synapse' 'tga' 'wallabag')
mkdir -p users
for user in "${users[@]}"; do
    echo "Generating ${user}"
    user_butane="users/${user}.bu"
    sed "s/__USER__/${user}/g" user-template.bu >| "${user_butane}"
    if [[ -d "quadlets/${user}" ]]; then
      directory_template_user="${directory_template//__USER__/${user}}"
      for file in "quadlets/${user}/"*.volume; do
        if [[ -f "${file}" ]]; then
          content="$(grep "Device" "${file}" || echo "none")"
          if [[ "${content}" =~ ^Device=/var/mnt/nas/containers/${user}/storage/(.+)$ ]]; then
            volume="${BASH_REMATCH[1]}"
            printf '%s' "${directory_template_user//__VOLUME__/${volume}}" >> "${user_butane}"
          else
            echo "Not found! ${content}"
          fi
        fi
      done
    fi
    printf '%s' "${files_template//__USER__/${user}}" >> "${user_butane}"
    if [[ -d "quadlets/${user}" ]]; then
      quadlet_template_user="${quadlet_template//__USER__/${user}}"
      for file in "quadlets/${user}/"*; do
        filename="$(basename "${file}")"
        printf '%s' "${quadlet_template_user//__FILE__/${filename}}" >> "${user_butane}"
      done
    fi
    if [[ -d "home/${user}" ]]; then
      home_template_user="${home_template//__USER__/${user}}"
      for file in "home/${user}/"*; do
        filename="$(basename "${file}")"
        printf '%s' "${home_template_user//__FILE__/${filename}}" >> "${user_butane}"
      done
    fi
    if [[ -d "services/${user}" ]]; then
      service_template_user="${service_template//__USER__/${user}}"
      for file in "services/${user}/"*; do
        filename="$(basename "${file}")"
        printf '%s' "${service_template_user//__FILE__/${filename}}" >> "${user_butane}"
      done
    fi
    podman run --rm --interactive --security-opt label=disable --volume "${PWD}:/pwd" --workdir /pwd quay.io/coreos/butane:release --pretty --strict -d /pwd "${user_butane}" >| "users/${user}.ign"
done
podman run --rm --interactive --security-opt label=disable --volume "${PWD}:/pwd" --workdir /pwd quay.io/coreos/butane:release --pretty --strict -d /pwd pi4.bu >| pi4.ign
