#!/bin/bash

# Меню помощи
show_help() {
    echo "Usage: sudo mac-podman-init -u USER -l LABEL [-d HOME_DIR] [-t TMP_DIR]"
    echo
    echo "  -u, --user       - Username (required)"
    echo "  -l, --label      - Mandatory label (required, 2-4 numbers through ':', for example: 1:0:0)"
    echo "  -d, --home       - Home directory (optional, default /home/.pdp/<user>/lXiXcXxXtXxX)"
    echo "  -t, --tmp        - Tmp directory (optional, default /tmp_user_label)"
    exit 1
}

# Флаг для итогового статуса
success=true

# Парсинг аргументов
while [[ $# -gt 0 ]]; do
    case "$1" in
        -u|--user)
            USERNAME="$2"
            shift 2
            ;;
        -d|--home)
            HOMEDIR="$2"
            shift 2
            ;;
        -t|--tmp)
            TMPDIR="$2"
            shift 2
            ;;
        -l|--label)
            LABEL="$2"
            shift 2
            ;;
        -h|--help)
            show_help
            ;;
        *)
            echo "Unknown parameter: $1"
            show_help
            ;;
    esac
done

# Проверка обязательных параметров
if [[ -z "$USERNAME" || -z "$LABEL" ]]; then
    echo "Error: username and label are required"
    show_help
fi
if ! id "$USERNAME" &>/dev/null; then
    echo "Error: user '$USERNAME' is not exist."
    show_help
fi
if [[ ! "$LABEL" =~ ^([0-9]+|-[0-9]+)(:([0-9]+|-[0-9]+)){1,3}$ ]];  then
    echo "Error: wrong format of levels!"
    show_help
fi
# Установка разделителя и подсчет частей для метки
IFS=':' read -ra PARTS <<< "$LABEL"
if (( ${#PARTS[@]} < 2 || ${#PARTS[@]} > 4 )); then
    echo "Error: Levels must be from 2 to 4 numbers, separated by ':'"
    show_help
fi

# Переменные для label (отображают метки)
lev=$(pdp-exec -l "$LABEL" pdp-id -l)
ilev=$(pdp-exec -l "$LABEL" pdp-id -i)
cat=$(pdp-exec -l "$LABEL" pdp-id -c)
dlev=$(pdp-exec -l $LABEL pdp-id -d)
if [ -z "$dlev" ]; then
    dlev="0x0"
fi

# Проверка на соответствие lev и ilev
if [[ "$ilev" -ne 0 && "$lev" -ne 0 ]]; then
    echo "Error: invalid set of labels. "
    exit 1
fi

# Составляем метку PDP
pdp_label_new="${lev}_${ilev}_${cat}_${dlev}"

sudo systemctl start "user@$(systemd-escape "$(id -u "$USERNAME")z${pdp_label_new}")"

# Установка runroot по умолчанию
XDG_RUNTIME_DIR="/run/user/$(id -u "$USERNAME")z${pdp_label_new}"

# Установка /tmp по умолчанию
if [[ -z "$TMPDIR" ]]; then
    TMPDIR="$XDG_RUNTIME_DIR/tmp"
fi
# Установка /home по умолчанию
if [[ -z "$HOMEDIR" ]]; then
    HOMEDIR="/home/.pdp/${USERNAME}/z${pdp_label_new}"
fi

# Создание директории runroot
if [[ ! -d "$XDG_RUNTIME_DIR" ]]; then
    mkdir -p "$XDG_RUNTIME_DIR" || success=false
fi
# Выдаем права и метки
pdpl-file "$lev:0:$cat:ccnr" -R "$XDG_RUNTIME_DIR" || success=false
chmod 700 -R "$XDG_RUNTIME_DIR" || success=false
chown "$USERNAME":"$USERNAME" "$XDG_RUNTIME_DIR" || success=false

# Создание директории TMPDIR
if [[ ! -d "$TMPDIR" ]]; then
    mkdir -p "$TMPDIR" || success=false
fi
# Выдаем права и метки
pdpl-file "$lev:0:$cat:ccnr" "$TMPDIR" || success=false
chmod 1777 "$TMPDIR" || success=false
chown "$USERNAME":"$USERNAME" "$TMPDIR" || success=false

# Создание директории HOME
if [[ ! -d "$HOMEDIR" ]]; then
    mkdir -p "$HOMEDIR" || success=false
fi

# Выдаем права и метки
pdpl-file "3:0:-1:ccnr" /home/.pdp/"$USERNAME" || success=false
pdpl-file "$lev:0:$cat:ccnr" "$HOMEDIR" || success=false
chmod 700 "$HOMEDIR" || success=false
chown "$USERNAME":"$USERNAME" "$HOMEDIR" || success=false

# Для системных папок, необходимых для работы подмана под секретностью
pdpl-file "0:0:0:ehole" "/dev/net/tun" || success=false

# Итоговый результат
if $success; then
    echo "Success"
else
    echo "Failed"
fi
