#!/usr/bin/env bash
set -euo pipefail
export LC_ALL=C

sink='@DEFAULT_SINK@'
audio_restored=0
config_dir="$HOME/.config/focal-on"
volume_file="$config_dir/volume"
frequency_file="$config_dir/frequency"
target_volume=100
frequency=100

if [[ -r "$volume_file" ]]; then
  read -r target_volume < "$volume_file" || target_volume=100
fi
if [[ ! "$target_volume" =~ ^[0-9]+$ ]] || ((target_volume < 0 || target_volume > 100)); then
  target_volume=100
fi
if [[ -r "$frequency_file" ]]; then
  read -r frequency < "$frequency_file" || frequency=100
fi
case "$frequency" in
  100|1000|9000|15000) ;;
  *) frequency=100 ;;
esac

mapfile -t old_volumes < <(pactl get-sink-volume "$sink" | grep -oE '[0-9]+%')
old_mute="$(pactl get-sink-mute "$sink" | awk '{print $2}')"

restore_audio() {
  ((audio_restored)) && return 0
  if ((${#old_volumes[@]})); then
    pactl set-sink-volume "$sink" "${old_volumes[@]}" >/dev/null 2>&1 || true
  fi
  pactl set-sink-mute "$sink" "$old_mute" >/dev/null 2>&1 || true
  audio_restored=1
}
trap restore_audio EXIT INT TERM

/usr/lib/focal-on/focal-on-volume.py >/dev/null 2>&1 &
window_pid=$!

pactl set-sink-mute "$sink" 0
pactl set-sink-volume "$sink" "${target_volume}%"

FOCAL_FREQUENCY="$frequency" python3 - <<'PY' | pw-play --raw --format=s16 --rate=48000 --channels=1 -
import math
import os
import struct
import sys

rate = 48_000
frequency = int(os.environ["FOCAL_FREQUENCY"])
duration = 0.5
amplitude = 0.90 * 32767

samples = bytearray()
for n in range(round(rate * duration)):
    value = round(amplitude * math.sin(2 * math.pi * frequency * n / rate))
    samples.extend(struct.pack('<h', value))
sys.stdout.buffer.write(samples)
PY

restore_audio
wait "$window_pid" 2>/dev/null || true
