#!/bin/bash

if ! [ -d $VREC_DIR ]; then
	mkdir -p $VREC_DIR
fi
if ! [ -d $AREC_DIR ]; then
	mkdir -p $AREC_DIR
fi

MONITOR=""
OUTPUT="$(date '+%y%m%d-%H%M-%S')"
TYPE="$1"
VIDEO_PID=""
AUDIO_PID=""

trap finishrecording INT

finishvideo () {
  kill -2 "$VIDEO_PID"
  notify-send "🔴 Recording" \
    "Screen recording stopped and saved at "$VREC_DIR"/video-"$OUTPUT".mp4"
}

finishaudio () {
  kill -2 "$AUDIO_PID"
  notify-send "🎙 Recording" \
    "Audio recording stopped and saved at "$AREC_DIR/$OUTPUT.flac""
}

finishscreencast () {
  kill -2 "$VIDEO_PID"
  kill -2 "$AUDIO_PID"
  notify-send "📼 Recording" "One moment, screencast is being encoded..."
  ffmpeg -i "$VREC_DIR/temp-$OUTPUT.mp4" \
    -i "$VREC_DIR/temp-$OUTPUT.opus" \
    -codec copy \
    -shortest \
    "$VREC_DIR/screencast-$OUTPUT.mp4"
  rm -f "$VREC_DIR/temp-$OUTPUT.mp4"
  rm -f "$VREC_DIR/temp-$OUTPUT.opus"
  notify-send "📼 Recording" \
    "Screencast recording stopped and saved at "$VREC_DIR/screencast-$OUTPUT.mp4""
}

finishscreenshare() {
  kill -2 "$VIDEO_PID"
  notify-send "📺 Recording" \
    "Screen sharing stopped."
}

finishrecording () {
  case "$TYPE" in
    video) finishvideo;;
    audio) finishaudio;;
    screencast) finishscreencast;;
    screenshare) finishscreenshare;;
  esac
  rm -f ~/.cache/recordingpid
  rm -f ~/.cache/recordingicon
  killall -39 waybar
}

killrecording () {
  RECPID="$(cat "$HOME/.cache/recordingpid")"
  kill -2 "$RECPID"
  exit
}

video () {
  wf-recorder -o "$MONITOR" -f "$VREC_DIR/video-$OUTPUT.mp4" &
  VIDEO_PID=$!
  echo $$ > ~/.cache/recordingpid
  echo "🔴" > ~/.cache/recordingicon
  notify-send "🔴 Recording" "Screen recording started"
  killall -39 waybar
  wait
}

screenshare () {
  # Hack to share screen in certain apps under wayland wlroots-based compositors
  loopbackcam="$(v4l2-ctl --list-devices | \
  	grep v4l2loopback -m1 -A1 | \
  	sed -e '1d' -e 's/\s//g')"
  wf-recorder -o "$MONITOR" -c rawvideo -m v4l2 -f $loopbackcam -x yuv420p -t &
  VIDEO_PID=$!
  echo $$ > ~/.cache/recordingpid
  echo "📺" > ~/.cache/recordingicon
  notify-send "📺 Recording" "Screen share to fake webcam started"
  killall -39 waybar
  wait
}

screencast () {
  wf-recorder -o "$MONITOR" -f "$VREC_DIR/temp-$OUTPUT.mp4" &
  VIDEO_PID=$!
  ffmpeg -f alsa -i default -c:a libopus "$VREC_DIR/temp-$OUTPUT.opus" &
  AUDIO_PID=$!
  echo $$ > ~/.cache/recordingpid
  echo "📼" > ~/.cache/recordingicon
  notify-send "📼 Recording" "Screencast recording started"
  killall -39 waybar
  wait
}

audio () {
  ffmpeg -f alsa -i default -c:a libopus "$AREC_DIR/$OUTPUT.opus" &
  AUDIO_PID=$!
  echo $$ > ~/.cache/recordingpid
  echo "🎙" > ~/.cache/recordingicon
  notify-send "🎙 Recording" "Audio recording started"
  killall -39 waybar
  wait
}

askrecording () {
  TYPE="$(echo -ne "video\0icon\x1fcamera-video\nscreencast\0icon\x1fcamera-web\nscreenshare\0icon\x1fvideo-display\naudio\0icon\x1faudio-input-microphone\n" | rofi -dmenu -i -p "What should be recorded?")"
  case "$TYPE" in
    video) video;;
    screencast) screencast;;
  	screenshare) screenshare;;
    audio) audio;;
    *) exit;;
  esac
}

if [ -f "$HOME/.cache/recordingpid" ]; then
  killrecording
  exit
fi

if [ $(swaymsg -t get_outputs | jq '. | length') -gt 1 ]; then
	MONITOR=$(swaymsg -t get_outputs | grep -E "name" | sed "s/^.*\"name\": \"\(.*\)\",/\1\x00icon\x1fdisplay/g;" | rofi -dmenu -i -p "Select display for capture")
else
	MONITOR="$(swaymsg -t get_outputs | jq -r '.[0]["name"]')"
fi

[ -z "$MONITOR" ] && exit 0

case $1 in
  video) video;;
  screencast) screencast;;
  screenshare) screenshare;;
  audio) audio;;
  kill) killrecording;;
  *) askrecording;;
esac