#!/bin/bash

VCP_CODE=10  # Код VCP для яркости

if ! command -v ddcutil &> /dev/null; then
    echo "Ошибка: ddcutil не установлен."
    exit 1
fi

I2C_BUSES=($(ddcutil detect | awk '/I2C bus/ {gsub("/dev/i2c-", "", $3); print $3}'))

if [ ${#I2C_BUSES[@]} -eq 0 ]; then
    echo "Не найдено ни одного монитора, поддерживающего DDC/CI."
    exit 1
fi

get_brightness() {
    local BUS=$1
    ddcutil --bus=$BUS getvcp $VCP_CODE | awk -F'=' '/current value/ {gsub(/[^0-9]/, "", $2); print $2}'
}

set_brightness() {
    local BUS=$1
    local BRIGHTNESS_ARG=$2
    local CURRENT_BRIGHTNESS=$(get_brightness "$BUS")

    if [ -z "$CURRENT_BRIGHTNESS" ]; then
        return 1
    fi

    if [[ "$BRIGHTNESS_ARG" =~ ^\+([0-9]+)$ ]]; then
        NEW_BRIGHTNESS=$((CURRENT_BRIGHTNESS + BASH_REMATCH[1]))
    elif [[ "$BRIGHTNESS_ARG" =~ ^([0-9]+)-$ ]]; then
        NEW_BRIGHTNESS=$((CURRENT_BRIGHTNESS - BASH_REMATCH[1]))
    elif [[ "$BRIGHTNESS_ARG" =~ ^([0-9]+)$ ]]; then
        NEW_BRIGHTNESS=$BRIGHTNESS_ARG
    else
        echo "Неверный формат аргумента яркости."
        return 1
    fi

    # Ограничиваем диапазон яркости (0-100)
    if [ "$NEW_BRIGHTNESS" -lt 0 ]; then
        NEW_BRIGHTNESS=0
    elif [ "$NEW_BRIGHTNESS" -gt 100 ]; then
        NEW_BRIGHTNESS=100
    fi

    ddcutil --bus=$BUS setvcp $VCP_CODE $NEW_BRIGHTNESS
    echo "Яркость на мониторе (шина $BUS) установлена на $NEW_BRIGHTNESS"
}

print_help() {
    echo "Использование:"
    echo "  ddclight set [значение] [-m N | -a]  — установить яркость"
    echo "  ddclight get [-m N | -a] [--waybar]   — получить яркость"
    echo
    echo "Примеры:"
    echo "  ddclight set 100         # Установить яркость на 100% для первого монитора"
    echo "  ddclight set +20         # Увеличить яркость на 20% для первого монитора"
    echo "  ddclight set 15-         # Уменьшить яркость на 15% для первого монитора"
    echo "  ddclight set -m 1 100    # Установить яркость 100% для монитора 1"
    echo "  ddclight set -a 15-      # Уменьшить яркость на 15% на всех мониторах"
    echo
    echo "  ddclight get             # Получить яркость первого монитора"
    echo "  ddclight get -m 1        # Получить яркость монитора 1"
    echo "  ddclight get -a          # Получить яркость всех мониторов"
    echo "  ddclight get --waybar    # Вывести яркость в формате JSON для waybar"
}

COMMAND=$1
shift

if [ -z "$COMMAND" ]; then
    print_help
    exit 0
fi

TARGET_MONITOR=""
ALL_MONITORS=false
WAYBAR_OUTPUT=false

while [[ $# -gt 0 ]]; do
    case "$1" in
        -m)
            TARGET_MONITOR=$2
            shift 2
            ;;
        -a)
            ALL_MONITORS=true
            shift
            ;;
        --waybar)
            WAYBAR_OUTPUT=true
            shift
            ;;
        -h|--help)
            print_help
            exit 0
            ;;
        *)
            BRIGHTNESS_ARG=$1
            shift
            ;;
    esac
done

if $ALL_MONITORS; then
    MONITORS=("${I2C_BUSES[@]}")
elif [ -n "$TARGET_MONITOR" ]; then
    if ! [[ "$TARGET_MONITOR" =~ ^[0-9]+$ ]] || [ "$TARGET_MONITOR" -lt 1 ] || [ "$TARGET_MONITOR" -gt ${#I2C_BUSES[@]} ]; then
        echo "Ошибка: монитор $TARGET_MONITOR не найден."
        exit 1
    fi
    MONITORS=("${I2C_BUSES[$((TARGET_MONITOR-1))]}")
else
    MONITORS=("${I2C_BUSES[0]}")
fi

case "$COMMAND" in
    set)
        if [ -z "$BRIGHTNESS_ARG" ]; then
            echo "Ошибка: необходимо указать значение яркости."
            exit 1
        fi
        for BUS in "${MONITORS[@]}"; do
            set_brightness "$BUS" "$BRIGHTNESS_ARG"
        done
        ;;
    
    get)
        if $WAYBAR_OUTPUT; then
            FIRST_BUS="${MONITORS[0]}"
            LAST_BRIGHTNESS=""

            while true; do
                CURRENT_BRIGHTNESS=$(get_brightness "$FIRST_BUS")
                if [[ "$CURRENT_BRIGHTNESS" != "$LAST_BRIGHTNESS" ]]; then
                    echo "{\"percentage\": $CURRENT_BRIGHTNESS}"
                    LAST_BRIGHTNESS="$CURRENT_BRIGHTNESS"
                fi
                sleep 0.5
            done
        else
            for BUS in "${MONITORS[@]}"; do
                echo "Монитор (шина $BUS): $(get_brightness "$BUS")"
            done
        fi
        ;;
    
    *)
        echo "Неверная команда: $COMMAND"
        print_help
        exit 1
        ;;
esac
