#!/usr/bin/env bash

action="$1"
service="$2"

set -e

. /usr/share/dosis2/bin/shell-support-functions

find_unit() {
    local pattern="$1"
    local unit

    # If the caller already supplied a unit type, use it.
    if echo "$pattern" | grep -qiE '\.(service|timer|socket|path|target|mount|automount|swap|device|scope|slice)$'; then
        systemctl list-unit-files --no-legend \
            | awk '{print $1}' \
            | grep -i "^${pattern}$" \
            | head -1
        return
    fi

    # Prefer timers over services.
    for ext in timer service; do
        unit=$(systemctl list-unit-files --no-legend \
            | awk '{print $1}' \
            | grep -i "^${pattern}\.${ext}$" \
            | head -1)

        if [ -n "$unit" ]; then
            echo "$unit"
            return
        fi
    done

    # Fall back to any matching unit type.
    systemctl list-unit-files --no-legend \
        | awk '{print $1}' \
        | grep -i "^${pattern}\." \
        | head -1
}

if [ "$(echo "${service}" | cut -d':' -f1)" = ".regex" ]; then
    pattern="$(echo "${service}" | cut -d':' -f2)"

    realservice=$(systemctl list-unit-files --no-legend \
        | awk '{print $1}' \
        | grep -i -E "${pattern}" \
        | head -1)

    [ -n "${realservice}" ] || abort 2 "Cannot find service that matches ${pattern}"

else
    servicesearch="${service}"

    # Preserve the instance name separately for template units.
    instance=""
    if echo "${service}" | grep -q '@'; then
        instance="$(echo "${service}" | cut -d'@' -f2 | sed 's/\.[^.]*$//')"
        servicesearch="$(echo "${service}" | cut -d'@' -f1)@"
    fi

    servicesearch="${servicesearch//_/-}"
    servicesearch="${servicesearch//-/[_-]}"

    realservice="$(find_unit "${servicesearch}")"

    [ -n "${realservice}" ] || abort 2 "Cannot find service for ${service} or one similar enough"

    # Expand template units (e.g. openvpn@.service -> openvpn@vpn_awse2c.service)
    if [ -n "${instance}" ]; then
        realservice="${realservice/@./@${instance}.}"
    fi
fi

systemctl "${action}" "${realservice}"