#!/usr/bin/env bash

# Author : Pavan Jadhaw
# Github Profile : https://github.com/pavanjadhaw
# Project Repository : https://github.com/pavanjadhaw/betterlockscreen


# create folder in ~/.cache/i3lock directory
folder="/home/nemo/projects/personal/avatars/lockscreen"

# ratio for rectangle to be drawn for time background on lockscreen
# Original Image
orig_wall="$folder/office.png"

# Versions (from here)
# You can use these images to set different versions as wallpaper
# lockscreen background.
resized="$folder/resized.png" # resized image for your resolution

# images to be used as wallpaper
dim="$folder/dim.png" # image with subtle overlay of black
blur="$folder/blur.png" # blurred version
dimblur="$folder/dimblur.png"

# lockscreen images (images to be used as lockscreen background)
l_resized="$folder/l_resized.png"
l_dim="$folder/l_dim.png"
l_blur="$folder/l_blur.png"
l_dimblur="$folder/l_dimblur.png"


prelock() {
	pkill -u "$USER" -USR1 dunst
}

lock() {
	#$1 image path
	letterEnteredColor=d23c3dff
	letterRemovedColor=d23c3dff
	passwordCorrect=00000000
	passwordIncorrect=d23c3dff
	background=00000000
	foreground=ffffffff
	i3lock \
		-t -i "$1"
		# --force-clock
		# --screen=0 \
        # --bar-indicator --bar-direction=0 \
		# --timecolor="$foreground" --datecolor="$foreground" \
        # --noinputtext="" \
		# --timepos="110:h-70" \
		# --datepos="135:h-45" \
		# --clock --datestr "Type password to unlock..." \
		# --blur=sigma \
		# --insidecolor=$background \
		# --ringcolor=$foreground \
		# --line-uses-inside \
		# --keyhlcolor=$letterEnteredColor --bshlcolor=$letterRemovedColor --separatorcolor=$background \
		# --insidevercolor=$passwordCorrect --insidewrongcolor=$passwordIncorrect \
		# --ringvercolor=$foreground --ringwrongcolor=$foreground \
		# --indpos="x+280:h-70" \
		# --radius=20 --ring-width=4 --veriftext="" --wrongtext="" \
		# --verifcolor="$foreground" \
}

postlock() {
	pkill -u "$USER" -USR2 dunst
}

rec_get_random() {
	dir="$1"
	if [ ! -d "$dir" ]; then
		user_input="$dir"
		return
	fi
	dir=($dir/*)
	dir=${dir[RANDOM % ${#dir[@]}]}
	rec_get_random "$dir"
}

usage() {

        echo "Important : Update the image cache, Ex: betterlockscreen -u path/to/image.jpg"
        echo "            Image cache must be updated to initially configure or update wallpaper used"
		echo
		echo
		echo "See : https://github.com/pavanjadhaw/betterlockscreen for additional info..."
		echo
		echo
		echo "Options:"
		echo
		echo "          -h --help"

		echo "              For help. Ex: betterlockscreen -h or betterlockscreen --help"
		echo
		echo
		echo "          -u --update"
		echo "              to update image cache, you should do this before using any other options"

		echo "              Ex: betterlockscreen -u path/to/image.png when image.png is custom background"
		echo "              Or you can use betterlockscreen -u path/to/imagedir and a random file will be selected"
		echo
		echo
		echo "          -l --lock"
		echo "              to lock screen, Ex. betterlockscreen -l"
		echo "              you can also use dimmed or blurred background for lockscreen"
		echo "              Ex: betterlockscreen -l dim (for dimmed background)"
		echo "              Ex: betterlockscreen -l blur (for blurred background)"
		echo "              Ex: betterlockscreen -l dimblur (for dimmed + blurred background)"
		echo
		echo
		echo "          -s --suspend"
		echo "              to suspend system and lock screen, Ex. betterlockscreen -s"
		echo "              you can also use dimmed or blurred background for lockscreen"
		echo "              Ex: betterlockscreen -s dim (for dimmed background)"
		echo "              Ex: betterlockscreen -s blur (for blurred background)"
		echo "              Ex: betterlockscreen -s dimblur (for dimmed + blurred background)"
		echo
		echo
		echo "          -w --wall"
		echo "              you can also set lockscreen background as wallpaper"
		echo "              to set wallpaper. Ex betterlockscreen -w or betterlockscreen --wall"
		echo "              you can also use dimmed or blurred variants"
		echo "              Ex: betterlockscreen -w dim (for dimmed wallpaper)"
		echo "              Ex: betterlockscreen -w blur (for blurred wallpaper)"
		echo "              Ex: betterlockscreen -w dimblur (for dimmed + blurred wallpaper)"
		echo
		echo
		echo "          -r --resolution"
		echo "              to be used after -u"
		echo "              used to set a custom resolution for the image cache."
		echo "              Ex: betterlockscreen -u path/to/image.png -r 1920x1080"
		echo "              Ex: betterlockscreen -u path/to/image.png --resolution 3840x1080"
		echo
		echo "          -b --blur"
		echo "              to be used after -u"
		echo "              used to set blur intensity. Default to 1."
		echo "              Ex: betterlockscreen -u path/to/image.png -b 3"
		echo "              Ex: betterlockscreen -u path/to/image.png --blur 0.5"
        echo

}

# Options
case "$1" in
	"")
		if [ ! -f $l_dim ]; then

			echo "Important : Update the image cache, Ex. betterlockscreen -u path/to/image.jpg"
			echo
            echo "            Image cache must be updated to initially configure or update wallpaper used"
            echo
			echo "See also : For other set of options and help use help command."
			echo "Ex. betterlockscreen -h or betterlockscreen --help"

			echo
			echo "See : https://github.com/pavanjadhaw/betterlockscreen for addition info..."
			exit 1
		else
			echo
			echo "Seems you havent provided any argument, see below for usage info"
			echo
			echo "See also : For other set of options and help use help command."

			echo "Ex. betterlockscreen -h or betterlockscreen --help"

			echo
			echo "See : https://github.com/pavanjadhaw/betterlockscreen for addition info..."
			echo
			exit 1
		fi
		;;

	-h | --help)

        usage

		;;

	-l | --lock)
		case "$2" in
			"")
				# default lockscreen
				prelock
				lock "$l_resized"
				postlock
				;;

			dim)
				# lockscreen with dimmed background
				prelock
				lock "$l_dim"
				postlock
				;;

			blur)
				# set lockscreen with blurred background
				prelock
				lock "$l_blur"
				postlock
				;;

			dimblur)
				# set lockscreen with dimmed + blurred background
				prelock
				lock "$l_dimblur"
				postlock
				;;
		esac
		;;

	-s | --suspend)
		case "$2" in
			"")
				# default lockscreen
				prelock
				lock "$l_resized" && systemctl suspend
				postlock
				;;

			dim)
				# lockscreen with dimmed background
				prelock
				lock "$l_dim" && systemctl suspend
				postlock
				;;

			blur)
				# set lockscreen with blurred background
				prelock
				lock "$l_blur" && systemctl suspend
				postlock
				;;

			dimblur)
				# set lockscreen with dimmed + blurred background
				prelock
				lock "$l_dimblur" && systemctl suspend
				postlock
				;;
		esac
		;;


	-w | --wall)
		case "$2" in
			"")
				# set resized image as wallpaper if no argument is supplied by user
				feh --bg-fill $resized
				;;

			dim)
				# set dimmed image as wallpaper
				feh --bg-fill $dim
				;;

			blur)
				# set blurred image as wallpaper
				feh --bg-fill $blur
				;;

			dimblur)
				# set dimmed + blurred image as wallpaper
				feh --bg-fill $dimblur
				;;
		esac
		;;

	-u | --update)
		background="$2"
		shift 2

		# find your resolution so images can be resized to match your screen resolution
		y_res=$(xdpyinfo | grep dimensions | sed -r 's/^[^0-9]*([0-9]+x[0-9]+).*$/\1/')
		# default blur level
		blur_level=1

		# parse update arguments
		while [ $# -gt 0 ]; do
		    case "$1" in
			-r | --resolution )
			    y_res="$2"
			    shift 2
			    ;;
			-b | --blur )
			    blur_level="$2"
			    shift 2
			    ;;
			*)
			    shift ;;
		    esac
		done

		rectangles=" "
		SR=$(xrandr --query | grep ' connected' | grep -o '[0-9][0-9]*x[0-9][0-9]*[^ ]*')
		for RES in $SR; do
			SRA=(${RES//[x+]/ })
			CX=$((${SRA[2]} + 25))
			CY=$((${SRA[1]} - 30))
			rectangles+="rectangle $CX,$CY $((CX+300)),$((CY-80)) "
		done

		# User supplied Image
		user_image="$folder/user_image.png"

		# create folder
		if [ ! -d $folder ]; then
			echo "Creating '$folder' directory to cache processed images."
			mkdir -p "$folder"
		fi

		# get random file in dir if passed argument is a dir
		rec_get_random "$background"

		# get user image
		cp "$user_input" "$user_image"
		if [ ! -f $user_image ]; then
			echo "Please specify the path to the image you would like to use"
			exit 1
		fi

		# replace orignal with user image
		cp "$user_image" "$orig_wall"
		rm "$user_image"

		echo "Generating alternate images based on the image you specified,"
		echo "please wait this might take few seconds..."

		# wallpapers

		echo
		echo "Converting provided image to match your resolution..."
		# resize image
		convert "$orig_wall" -resize "$y_res""^" -gravity center -extent "$y_res" "$resized"

		echo
		echo "Applying dim and blur effect to resized image"
		# dim
		convert "$resized" -fill black -colorize 40% "$dim"

		# blur
		blur_shrink=$(echo "scale=2; 20 / $blur_level" | bc)
		blur_sigma=$(echo "scale=2; 0.6 * $blur_level" | bc)
		convert "$resized" \
		    -filter Gaussian \
		    -resize "$blur_shrink%" \
		    -define "filter:sigma=$blur_sigma" \
		    -resize "$y_res^" -gravity center -extent "$y_res" \
		    "$blur"

		# dimblur
		convert "$dim" \
		    -filter Gaussian \
		    -resize "$blur_shrink%" \
		    -define "filter:sigma=$blur_sigma" \
		    -resize "$y_res^" -gravity center -extent "$y_res" \
		    "$dimblur"

		# lockscreen backgrounds

		echo
		echo "Caching images for faster screen locking"
		# resized
		convert "$resized" -draw "fill black fill-opacity 0.4 $rectangles" "$l_resized"

		# dim
		convert "$dim" -draw "fill black fill-opacity 0.4 $rectangles" "$l_dim"

		# blur
		convert "$blur" -draw "fill black fill-opacity 0.4 $rectangles" "$l_blur"

		# blur
		convert "$dimblur" -draw "fill black fill-opacity 0.4 $rectangles" "$l_dimblur"

		echo
		echo "All required changes have been applied"
		;;
esac
