#!/bin/bash

set -u

show_progress() {
    qs ipc call osd progress "$1" "$2" 100 "$3" >/dev/null 2>&1 || true
}

show_message() {
    qs ipc call osd message "$1" "$2" >/dev/null 2>&1 || true
}

volume_state() {
    local target="$1" output level percent muted=false
    output="$(wpctl get-volume "$target" 2>/dev/null)" || return 1
    if [[ $output =~ Volume:[[:space:]]*([0-9]+([.][0-9]+)?) ]]; then
        level="${BASH_REMATCH[1]}"
    else
        return 1
    fi
    [[ $output == *"[MUTED]"* ]] && muted=true
    percent="$(awk -v value="$level" 'BEGIN { printf "%d", value * 100 + 0.5 }')"
    printf '%s %s\n' "$percent" "$muted"
}

show_volume() {
    local target="$1" kind="$2" state percent muted label
    state="$(volume_state "$target")" || return 0
    read -r percent muted <<<"$state"
    if [[ $muted == true ]]; then
        show_progress "${kind}-muted" "$percent" "Muted"
    else
        label="${percent}%"
        show_progress "$kind" "$percent" "$label"
    fi
}

adjust_volume() {
    local action="${1:-}" step="${2:-6}" target="@DEFAULT_AUDIO_SINK@"
    case "$action" in
        up) wpctl set-volume -l 1 "$target" "${step}%+" || return ;;
        down) wpctl set-volume "$target" "${step}%-" || return ;;
        toggle) wpctl set-mute "$target" toggle || return ;;
        *) printf 'Usage: panama-osd volume up|down|toggle [step]\n' >&2; return 2 ;;
    esac
    show_volume "$target" volume
}

adjust_microphone() {
    local action="${1:-}" step="${2:-6}" target="@DEFAULT_AUDIO_SOURCE@"
    case "$action" in
        up) wpctl set-volume -l 1 "$target" "${step}%+" || return ;;
        down) wpctl set-volume "$target" "${step}%-" || return ;;
        toggle) wpctl set-mute "$target" toggle || return ;;
        *) printf 'Usage: panama-osd microphone up|down|toggle [step]\n' >&2; return 2 ;;
    esac
    show_volume "$target" microphone
}

adjust_brightness() {
    local action="${1:-}" step="${2:-5}" output percent
    case "$action" in
        up) brightnessctl -e4 -n2 set "${step}%+" >/dev/null || return ;;
        down) brightnessctl -e4 -n2 set "${step}%-" >/dev/null || return ;;
        *) printf 'Usage: panama-osd brightness up|down [step]\n' >&2; return 2 ;;
    esac

    output="$(brightnessctl -m -c backlight 2>/dev/null)" || return 0
    percent="$(awk -F, 'NR == 1 { value=$5; gsub(/%/, "", value); print value }' <<<"$output")"
    [[ $percent =~ ^[0-9]+$ ]] || return 0
    show_progress brightness "$percent" "${percent}%"
}

media_action() {
    local action="${1:-}" kind label fallback
    case "$action" in
        play-pause)
            playerctl play-pause || return
            if [[ $(playerctl status 2>/dev/null) == "Playing" ]]; then
                kind="media-play"
                fallback="Playing"
            else
                kind="media-pause"
                fallback="Paused"
            fi
            ;;
        next) playerctl next || return; kind="media-next"; fallback="Next track" ;;
        previous) playerctl previous || return; kind="media-previous"; fallback="Previous track" ;;
        stop) playerctl stop || return; kind="media-stop"; fallback="Stopped" ;;
        *) printf 'Usage: panama-osd media play-pause|next|previous|stop\n' >&2; return 2 ;;
    esac

    label="$(playerctl metadata --format '{{ title }} — {{ artist }}' 2>/dev/null)"
    [[ -n $label ]] || label="$fallback"
    show_message "$kind" "$label"
}

case "${1:-}" in
    volume) shift; adjust_volume "$@" ;;
    microphone) shift; adjust_microphone "$@" ;;
    brightness) shift; adjust_brightness "$@" ;;
    media) shift; media_action "$@" ;;
    *)
        printf 'Usage: panama-osd volume|microphone|brightness|media ACTION [step]\n' >&2
        exit 2
        ;;
esac
