#!/usr/bin/env bash

# Screenshot directory
screenshot_directory="$HOME/Pictures/screenshots/rofi"
videos_directory="$HOME/Videos/rofi"
audio_directory="$HOME/Music/rofi"

# set ffmpeg defaults
ffmpeg() {
    command ffmpeg -hide_banner -loglevel error -nostdin "$@"
}

video_to_gif() {
    ffmpeg -i "$1" -vf palettegen -f image2 -c:v png - |
        ffmpeg -i "$1" -i - -filter_complex paletteuse "$2"
}

countdown() {
    notify-send "Screenshot" "Recording in 3 seconds" -t 1000 -i record
    sleep 1
    notify-send "Screenshot" "Recording in 2 seconds" -t 1000 -i record
    sleep 1
    notify-send "Screenshot" "Recording in 1 seconds" -t 1000 -i record
    sleep 1
}

# capture region to clipboard
crtc() {
    notify-send "Screenshot" "Select a region to capture"
    ffcast -q $(slop -n -f '-g %g ') png /tmp/screenshot_clip.png
    xclip -selection clipboard -t image/png /tmp/screenshot_clip.png
    rm /tmp/screenshot_clip.png
    notify-send "Screenshot" "Region copied to Clipboard"
}

# capture region to file and clipboard
crtf() {
    notify-send "Screenshot" "Select a region to capture"
    dt=$(date '+%d-%m-%Y %H:%M:%S')
    ffcast -q $(slop -n -f '-g %g ') png "$screenshot_directory/$dt.png"
    xclip -selection clipboard -t image/png "$screenshot_directory/$dt.png"
    notify-send "Screenshot" "Region saved to $screenshot_directory"
}

# capture screenshot to clipboard
cstc() {
    ffcast -q png /tmp/screenshot_clip.png
    xclip -selection clipboard -t image/png /tmp/screenshot_clip.png
    rm /tmp/screenshot_clip.png
    notify-send "Screenshot" "Screenshot copied to Clipboard"
}

# capture screenshot to file and clipboard
cstf() {
    dt=$(date '+%d-%m-%Y %H:%M:%S')
    ffcast -q png "$screenshot_directory/$dt.png"
    xclip -selection clipboard -t image/png "$screenshot_directory/$dt.png"
    notify-send "Screenshot" "Screenshot saved to $screenshot_directory"
}

# record region (GIF)
rrg() {
    notify-send "Screenshot" "Select a region to record"
    dt=$(date '+%d-%m-%Y %H:%M:%S')
    ffcast -q $(slop -n -f '-g %g ' && countdown) rec /tmp/screenshot_gif.mp4
    notify-send "Screenshot" "Converting to gif... (this can take a while)"
    video_to_gif /tmp/screenshot_gif.mp4 "$screenshot_directory/$dt.gif"
    rm /tmp/screenshot_gif.mp4
    notify-send "Screenshot" "Recording saved to $screenshot_directory"
}

# record screen (GIF)
rsg() {
    countdown
    dt=$(date '+%d-%m-%Y %H:%M:%S')
    ffcast -q rec /tmp/screenshot_gif.mp4
    notify-send "Screenshot" "Converting to gif... (this can take a while)"
    video_to_gif /tmp/screenshot_gif.mp4 "$screenshot_directory/$dt.gif"
    rm /tmp/screenshot_gif.mp4
    notify-send "Screenshot" "Recording saved to $screenshot_directory"
}

# record region (mp4)
rrv() {
    notify-send "Screenshot" "Select a region to record"
    dt=$(date '+%d-%m-%Y %H:%M:%S')
    ffcast -q $(slop -n -f '-g %g ' && countdown) rec "$videos_directory/$dt.mp4"
    notify-send "Screenshot" "Recording saved to $videos_directory"
}

# record screen (mp4)
rsv() {
    countdown
    dt=$(date '+%d-%m-%Y %H:%M:%S')
    ffcast -q rec "$videos_directory/$dt.mp4"
    notify-send "Screenshot" "Recording saved to $videos_directory"
}

# record screen (mp4) with audio virt
rrav() {
    notify-send "Screenshot" "Select a region to record"
    dt=$(date '+%d-%m-%Y %H:%M:%S')
    ffcast -q $(slop -n -f '-g %g ' && countdown) ffmpeg \
        -hide_banner \
        -loglevel error \
        -f x11grab -show_region 1 -framerate 30 -video_size %wx%h -i :0.0+%x,%y \
        -f pulse -i alsa_output.pci-0000_00_1f.3.analog-stereo.monitor -ac 1 "$videos_directory/$dt.mp4"
    notify-send "Screenshot" "Recording saved to $videos_directory"
}

# record screen (mp4) with mic audio
rrmv() {
    notify-send "Screenshot" "Select a region to record"
    dt=$(date '+%d-%m-%Y %H:%M:%S')
    ffcast -q $(slop -n -f '-g %g ' && countdown) ffmpeg \
        -hide_banner \
        -loglevel error \
        -f x11grab -show_region 1 -framerate 30 -video_size %wx%h -i :0.0+%x,%y \
        -f pulse -i alsa_input.pci-0000_00_1f.3.analog-stereo -ac 1 "$videos_directory/$dt.mp4"
    notify-send "Screenshot" "Recording saved to $videos_directory"
}

# record audio virt
rav() {
    notify-send "Screenshot" "Starting audio recording." -i sound-recorder
    dt=$(date '+%d-%m-%Y %H:%M:%S')
    'ffmpeg' \
        -loglevel error \
        -f pulse -i alsa_output.pci-0000_00_1f.3.analog-stereo.monitor -ac 1 "$audio_directory/$dt.mp3"
    notify-send "Screenshot" "Audio saved to $audio_directory" -i sound-recorder
}

# record audio mic
ram() {
    notify-send "Screenshot" "Starting audio recording." -i sound-recorder
    dt=$(date '+%d-%m-%Y %H:%M:%S')
    'ffmpeg' \
        -loglevel error \
        -f pulse -i alsa_input.pci-0000_00_1f.3.analog-stereo -ac 1 "$audio_directory/$dt.mp3"
    notify-send "Screenshot" "Audio saved to $audio_directory" -i sound-recorder
}

check_deps() {
    if ! hash $1 2>/dev/null; then
        echo "Error: This script requires $1"
        exit 1
    fi
}

usage() {
    echo USAGE: screenshot [OPTION]
    echo -s, --stop
    echo "    stop recording"
    echo -h, --help
    echo "    show help"
    echo -crtc
    echo "    Capture region to clipboard."
    echo -crtf
    echo "    Capture screen to file and clipboard"
    echo -cstc
    echo "    Capture screen to clipboard."
    echo -cstf
    echo "    Capture screen to file and clipboard"
    echo -rrg
    echo "    Record (GIF) region."
    echo -rsg
    echo "    Record (GIF) screen."
    echo -rrv
    echo "    Record (mp4/video) region."
    echo -rsv
    echo "    Record (mp4/video) screen."
    echo -rrav
    echo "    Record (mp4/video+audio(virt)) region."
    echo -rrmv
    echo "    Record (mp4/video+audio(mic)) region."
    echo -rav
    echo "    Record audio virt."
    echo -ram
    echo "    Record audio mic."
    exit 1
}

main() {
    # check dependencies
    check_deps slop
    check_deps ffcast
    check_deps ffmpeg
    check_deps xclip
    check_deps rofi

    while [ "$1" != "" ]; do
        PARAM="$1"
        case $PARAM in
        -h | --help)
            usage
            exit
            ;;
        -s | --stop)
            pkill -fxn '(/\S+)*ffmpeg\s.*\sx11grab\s.*'
            pkill -fxn '(/\S+)*ffmpeg\s.*\spulse\s.*'
            exit 1
            ;;
        -crtc)
            crtc
            ;;
        -crtf)
            crtf
            ;;
        -cstc)
            cstc
            ;;
        -cstf)
            cstf
            ;;
        -rrg)
            rrg
            ;;
        -rsg)
            rsg
            ;;
        -rrv)
            rrv
            ;;
        -rsv)
            rsv
            ;;
        -rrav)
            rrav
            ;;
        -rrmv)
            rrmv
            ;;
        -rav)
            rav
            ;;
        -ram)
            ram
            ;;
        *)
            echo "ERROR: unknown parameter \"$PARAM\""
            usage
            exit 1
            ;;
        esac
        shift
    done
    # done
    set -e
}

# running the program
main $1 &
exit 0
