#!/bin/sh
set -eu

HELPER="/usr/libexec/dd-musicplayer-plugin/dd-musicplayer-install-prompt"

shell_quote()
{
    printf "'%s'" "$(printf '%s' "$1" | sed "s/'/'\\\\''/g")"
}

append_env()
{
    command="$command $1=$(shell_quote "$2")"
}

qt_qpa_platform_for_session_type()
{
    case "${1:-}" in
        x11)    printf '%s\n' "dxcb:xcb" ;;
        wayland) printf '%s\n' "wayland" ;;
        *)      printf '\n' ;;
    esac
}

read_session_env()
{
    pid="$1"
    name="$2"

    [ -n "$pid" ] || return 1
    [ -r "/proc/$pid/environ" ] || return 1

    tr '\0' '\n' < "/proc/$pid/environ" | sed -n "s/^${name}=//p" | head -n 1
}

find_active_session()
{
    loginctl list-sessions --no-legend 2>/dev/null | while read -r sid _rest; do
        [ -n "$sid" ] || continue

        active=$(loginctl show-session "$sid" -p Active --value 2>/dev/null || true)
        state=$(loginctl show-session "$sid" -p State --value 2>/dev/null || true)
        remote=$(loginctl show-session "$sid" -p Remote --value 2>/dev/null || true)
        session_type=$(loginctl show-session "$sid" -p Type --value 2>/dev/null || true)
        user_name=$(loginctl show-session "$sid" -p Name --value 2>/dev/null || true)
        user_id=$(loginctl show-session "$sid" -p User --value 2>/dev/null || true)
        leader=$(loginctl show-session "$sid" -p Leader --value 2>/dev/null || true)
        display=$(loginctl show-session "$sid" -p Display --value 2>/dev/null || true)

        [ "$active" = "yes" ] || continue
        [ "$state" = "active" ] || continue
        [ "$remote" = "no" ] || continue
        [ -n "$user_name" ] || continue
        [ -n "$user_id" ] || continue

        printf '%s\n%s\n%s\n%s\n%s\n' "$user_name" "$user_id" "$session_type" "$display" "$leader"
        return 0
    done

    return 1
}

reload_dconfig() {
    if command -v dde-dconfig >/dev/null 2>&1; then
        dde-dconfig --set org.deepin.dde.file-manager \
            org.deepin.dde.file-manager.desktop.musicplayer \
            enable true 2>/dev/null || true
    fi

    if command -v systemctl >/dev/null 2>&1; then
        systemctl --user try-restart dsg-data-sync.service 2>/dev/null || true
    fi
}

restart_dde_file_manager() {
    reload_dconfig

    if command -v systemctl >/dev/null 2>&1; then
        systemctl --user daemon-reload 2>/dev/null || true
        sleep 1
        systemctl --user restart dde-file-manager.service 2>/dev/null || true
        sleep 1
        systemctl --user restart dde-shell-plugin@org.deepin.ds.desktop.service 2>/dev/null || true
    fi

    sleep 2

    if command -v dbus-send >/dev/null 2>&1; then
        dbus-send --session --type=method_call \
            --dest=org.deepin.Filemanager.Daemon \
            /org/deepin/Filemanager/Daemon \
            org.deepin.Filemanager.Daemon.Refresh 2>/dev/null || true
    fi
}

launch_install_prompt()
{
    mode="$1"

    [ -x "$HELPER" ] || return 1

    session=$(find_active_session || true)
    [ -n "$session" ] || return 1

    user_name=$(printf '%s' "$session" | sed -n '1p')
    user_id=$(printf '%s' "$session" | sed -n '2p')
    session_type=$(printf '%s' "$session" | sed -n '3p')
    display=$(printf '%s' "$session" | sed -n '4p')
    leader=$(printf '%s' "$session" | sed -n '5p')

    runtime_dir="/run/user/$user_id"
    [ -d "$runtime_dir" ] || return 1
    [ -S "$runtime_dir/bus" ] || return 1

    home_dir=$(getent passwd "$user_name" | cut -d: -f6)
    [ -n "$home_dir" ] || return 1

    command=""
    append_env HOME "$home_dir"
    append_env USER "$user_name"
    append_env LOGNAME "$user_name"
    append_env XDG_RUNTIME_DIR "$runtime_dir"
    append_env DBUS_SESSION_BUS_ADDRESS "unix:path=$runtime_dir/bus"

    if [ -n "$display" ]; then
        append_env DISPLAY "$display"
    fi

    for env_name in XDG_CURRENT_DESKTOP DESKTOP_SESSION QT_QPA_PLATFORMTHEME QT_STYLE_OVERRIDE LANG LANGUAGE LC_ALL LC_MESSAGES D_THEME_TYPE D_DXCB_THEME; do
        env_value=$(read_session_env "$leader" "$env_name" || true)
        if [ -n "$env_value" ]; then
            append_env "$env_name" "$env_value"
        fi
    done

    config_home=$(read_session_env "$leader" "XDG_CONFIG_HOME" || true)
    if [ -n "$config_home" ]; then
        append_env XDG_CONFIG_HOME "$config_home"
    else
        append_env XDG_CONFIG_HOME "$home_dir/.config"
    fi

    data_home=$(read_session_env "$leader" "XDG_DATA_HOME" || true)
    if [ -n "$data_home" ]; then
        append_env XDG_DATA_HOME "$data_home"
    else
        append_env XDG_DATA_HOME "$home_dir/.local/share"
    fi

    cache_home=$(read_session_env "$leader" "XDG_CACHE_HOME" || true)
    if [ -n "$cache_home" ]; then
        append_env XDG_CACHE_HOME "$cache_home"
    else
        append_env XDG_CACHE_HOME "$home_dir/.cache"
    fi

    if [ "$session_type" = "wayland" ]; then
        append_env XDG_SESSION_TYPE "wayland"
        append_env QT_QPA_PLATFORM "$(qt_qpa_platform_for_session_type "$session_type")"
        for candidate in "$runtime_dir/wayland-0" "$runtime_dir/wayland-1"; do
            if [ -S "$candidate" ]; then
                append_env WAYLAND_DISPLAY "$(basename "$candidate")"
                break
            fi
        done
    else
        append_env XDG_SESSION_TYPE "$session_type"
        qpa_platform=$(qt_qpa_platform_for_session_type "$session_type")
        if [ -n "$qpa_platform" ]; then
            append_env QT_QPA_PLATFORM "$qpa_platform"
        fi
    fi

    command="$command $(shell_quote "$HELPER") --mode $(shell_quote "$mode")"

    runuser -u "$user_name" -- sh -c "$command" >/dev/null 2>&1 &
}

if [ "${DEBIAN_POSTINST_SOURCE_ONLY:-0}" = "1" ]; then
    exit 0
fi

if [ "$1" != "configure" ]; then
    exit 0
fi

reload_dconfig

mode=install
if [ -n "${2:-}" ]; then
    mode=upgrade
fi

launch_install_prompt "$mode" || restart_dde_file_manager

exit 0