#!/bin/bash

# Flexible option parsing for msd

if [[ $1 == "-dr" ]]; then
    systemctl daemon-reload
    exit 0
fi

# Default values
cmd=""
name=""
wd=""
mode=""

# Parse options
while [[ $# -gt 0 ]]; do
    case $1 in
        -c|-r|-st|-k|-rm|-h)
            mode=$1
            shift
        ;;
        -n)
            name=$2
            shift 2
        ;;
        -e)
            cmd=$2
            shift 2
        ;;
        -w)
            wd=$2
            shift 2
        ;;
        -d)
            debug=true
        ;;
        *)
            shift
        ;;
    esac
done

case $mode in
    -h)
        cat << EOF
Usage: msd [MODE] [OPTIONS]
Modes:
  -c      Create service (-n name -e exec [-w workdir])
  -r      Restart service (-n name)
  -st     Start service (-n name)
  -k      Shutdown service (-n name)
  -d      Delete service (-n name)
  -dr     systemctl daemon-reload
Options:
  -n NAME         Service name
  -e EXEC         Exec command (for -c)
  -w WORKDIR      Working directory (for -c)
EOF
        ;;
    -c)
        if [[ -z $name || -z $cmd ]]; then
            echo "You must provide -n (name) and -e (exec) for creation."
            exit 1
        fi
        cat << EOF > /etc/systemd/system/${name,,}.service
[Unit]
Description=$name
After=network.target
Wants=network-online.target

[Service]
Restart=on-success
Type=simple
ExecStart=$cmd
WorkingDirectory=$wd

[Install]
WantedBy=multi-user.target
EOF
        systemctl enable ${name,,}.service
        systemctl start ${name,,}.service
        [[ -n $debug ]] && journalctl -f -u ${name,,}.service
        ;;
    -r)
        if [[ -z $name ]]; then
            echo "You must provide -n (name) for restart."
            exit 1
        fi
        ! [[ -f /etc/systemd/system/${name,,}.service ]] && ! [[ -f /usr/lib/systemd/system/${name,,}.service ]] && echo "Service $name does not exist" && exit 1
        systemctl kill ${name,,}.service
        systemctl start ${name,,}.service
        [[ -n $debug ]] && journalctl -f -u ${name,,}.service
        ;;
    -st)
        if [[ -z $name ]]; then
            echo "You must provide -n (name) for start."
            exit 1
        fi
        systemctl start ${name,,}.service
        [[ -n $debug ]] && journalctl -f -u ${name,,}.service
        ;;
    -k)
        if [[ -z $name ]]; then
            echo "You must provide -n (name) for shutdown."
            exit 1
        fi
        ! [[ -f /etc/systemd/system/${name,,}.service ]] && ! [[ -f /usr/lib/systemd/system/${name,,}.service ]] && echo "Service $name does not exist" && exit 1
        systemctl kill ${name,,}.service
        ;;
    -rm)
        if [[ -z $name ]]; then
            echo "You must provide -n (name) for delete."
            exit 1
        fi
        ! [[ -f /etc/systemd/system/${name,,}.service ]] && echo "Service $name does not exist" && exit 1
        systemctl kill ${name,,}.service
        systemctl disable ${name,,}.service
        rm /etc/systemd/system/${name,,}.service
        ;;
    *)
        echo "Unknown or missing argument"
        exit 1
        ;;
esac