#!/usr/bin/env bash

[ -z "$XDG_CONFIG_HOME" ] && XDG_CONFIG_HOME="$HOME/.config"

CMD=/usr/local/bin/ani-cli
DEFAULT_DOWNLOAD="$HOME/Videos/sauce"
CFG_DIR="$XDG_CONFIG_HOME/aniwrapper"
DEFAULT_PLAYLIST="$CFG_DIR/playlists/playlist.txt"
CFG_FILE="meh.rasi"
VERBOSE=0

while getopts 'vh' OPT; do
	case "$OPT" in
		h)
			help_text
			;;
		v)
			VERBOSE=1
			;;
		*)
			log "Invalid option"
			exit 1
			;;
	esac
done

quit="6. Quit"
options="1. Stream|2. Download|3. Continue|4. Playlist|5. Sync History|$quit"

[ "$VERBOSE" -eq 1 ] && printf "%s\n" "CONFIG DIR: $CFG_DIR"

choice=$(echo "${options[@]}" | rofi -dmenu -sep '|' \
	-config "$CFG_DIR/$CFG_FILE" -l 6 -i -p "Aniwrapper")

seppuku() {
	printf "%s\n" "$*"
	exit 1
}

quit() {
	printf "%s\n" 'Quitting...'
	exit 0
}

run() {
	if [[ "$VERBOSE" -eq 0 ]]; then
		"$CMD" "$*"
	else
		"$CMD" -v "$*"
	fi
}

log() {
	if [[ "$VERBOSE" -eq 1 ]]; then
		printf "%s\n" "$*"
	fi
}

[ "$choice" == "$quit" ] && quit

selection=$(printf "%s\n" "$choice" | awk '{ print $1 }')

case "$selection" in
	1.)
		# ---------------------------------------------------------------------------
		# streaming
		# ---------------------------------------------------------------------------
		log "Streaming mode"
		run
		;;
	2.)
		# ---------------------------------------------------------------------------
		# download
		# ---------------------------------------------------------------------------
		log "Download anime"
		dl_dir=$(rofi -dmenu -config "$CFG_DIR/$CFG_FILE" \
			-l 1 -p "Enter download dir:")
		# if dl_dir is none set to current directory
		[ "$dl_dir" == "" ] && dl_dir="$DEFAULT_DOWNLOAD"
		run -d "$dl_dir"
		;;
	3.)

		# ---------------------------------------------------------------------------
		# continue
		# ---------------------------------------------------------------------------
		log "Continue watching"
		run -H
		;;
	4.)
		# ---------------------------------------------------------------------------
		# playlist mode
		# ---------------------------------------------------------------------------
		log "Playlist mode"
		options="1. Play playlist|2. Add to playlist|3. Delete from playlist|4. Quit"
		choice=$(printf "%s\n" "${options[@]}" |
			rofi -dmenu -sep '|' \
				-config "$CFG_DIR/$CFG_FILE" -l 4 -i -p "Enter choice:")
		[ -z "$choice" ] && seppuku "No choice selected"
		[ "$choice" == "$quit" ] && quit
		selection=$(printf "%s\n" "$choice" | awk '{ print $1 }')
		if [[ "$selection" == "1." ]]; then
			# ------------------------------------------------------------------
			# watch playlist
			# ------------------------------------------------------------------
			log "Playlist mode"
			options="1. From file|2. Streaming|3. Quit"
			choice=$(printf "%s\n" "${options[@]}" |
				rofi -dmenu -sep '|' \
					-config "$CFG_DIR/$CFG_FILE" -l 4 -i -p "Enter choice:")
			[ -z "$choice" ] && seppuku "No choice selected"
			[ "$choice" == "$quit" ] && quit
			log "Selection: $choice"
			selection=$(printf "%s\n" "$choice" | awk '{ print $1 }')
			if [[ "$selection" == "1." ]]; then
				# --------------------------------------------------------------
				# watch playlist from file (downloaded videos)
				# --------------------------------------------------------------
				log "Watching playlist from file"
				PLAYLIST_DIR="$HOME/Videos/sauce"
				log "Default playlist directory: $PLAYLIST_DIR"
				choice=$(cd "$PLAYLIST_DIR" && find . -mindepth 1 -type d |
					cut -c 3- |
					rofi -dmenu \
						-config "$CFG_DIR/$CFG_FILE" -l 5 -i -p "Choose playlist:")
				[ -z "$choice" ] && seppuku "No choice selected"
				log "Choice" "$choice"
				run -P "$PLAYLIST_DIR/$choice"
			elif [[ "$selection" == "2." ]]; then
				# --------------------------------------------------------------
				# watch playlist of 'queued' videos to stream
				# --------------------------------------------------------------
				log "Watching from 'queue'"
				choice=$(rofi -dmenu \
					-config "$CFG_DIR/$CFG_FILE" \
					-l 1 -p "Enter path to playlist file (or leave blank for default):")
				if [[ "$choice" ]]; then
					PLAYLIST_FILE="$choice"
				else
					PLAYLIST_FILE="$DEFAULT_PLAYLIST"
				fi
				run -p
			fi
		elif [[ "$selection" == "2." ]]; then
			# ------------------------------------------------------------------
			# add to playlist
			# ------------------------------------------------------------------
			log "Add to playlist"
			choice=$(rofi -dmenu \
				-config "$CFG_DIR/$CFG_FILE" \
				-l 1 -p "Enter path to playlist file (or leave blank for default):")
			if [[ "$choice" ]]; then
				PLAYLIST_FILE="$choice"
			else
				PLAYLIST_FILE="$DEFAULT_PLAYLIST"
			fi
			run -a "$PLAYLIST_FILE"
		elif [[ "$selection" == "3." ]]; then
			# -----------------------------------------------------------------------
			# delete from playlist
			# -----------------------------------------------------------------------
			log "Delete from playlist"
			choice=$(rofi -dmenu \
				-config "$CFG_DIR/$CFG_FILE" \
				-l 1 -p "Enter path to playlist file (or leave blank for default):")
			if [[ "$choice" ]]; then
				PLAYLIST_FILE="$choice"
			else
				PLAYLIST_FILE="$DEFAULT_PLAYLIST"
			fi
			[ "$VERBOSE" -eq 1 ] && log "playlist file: $PLAYLIST_FILE"
			lines=""
			cnt=0
			while read -r line; do
				if [[ "$cnt" -eq 0 ]]; then
					lines="$((cnt + 1)). $line"
				else
					lines="$lines|$((cnt + 1)). $line"
				fi
				((cnt++))
			done <"$PLAYLIST_FILE"
			choice=$(rofi -dmenu -l 12 \
				-sep '|' \
				-config "$CFG_DIR/$CFG_FILE" -p "Choose episode to delete:" \
				<<<"${lines[*]}")
			log "choice: $choice"
			selection=$(awk '{print $1}' <<<"$choice")
			idx=${selection//\./}
			log "index selected: $idx"
			log "deleting entry: $idx"
			if [[ -z "$idx" ]]; then
				log "no entry selected"
				exit 1
			fi
			sed -ie "$idx"d "$PLAYLIST_FILE"
			if [ "$?" -eq 0 ]; then
				log "$selection deleted from playlist"
				exit 0
			else
				log "there was a problem deleting $choice"
				exit 1
			fi
		fi
		;;
	5.)
		log "Sync history database"
		# username=$(rofi -dmenu -config "$CFG_DIR/$CFG_FILE" \
		# 	-l 1 -p "Enter the username of the remote user:")
		# if [[ -z "$username" ]] || [[ "$username" == "" ]]; then
		# 	log "No username provided... exiting"
		# 	exit 1
		# fi
		# host=$(rofi -dmenu -config "$CFG_DIR/$CFG_FILE" \
		# 	-l 1 -p "Enter the host for the remote machine (eg 192.168.1.99):")
		# if [[ -z "$host" ]] || [[ "$host" == "" ]]; then
		# 	log "No host provided... exiting"
		# 	exit 1
		# fi
		# port=$(rofi -dmenu -config "$CFG_DIR/$CFG_FILE" \
		# 	-l 1 -p "Enter in the ssh port for remote machine or leave blank for default [22]:")
		# if [[ -z "$port" ]] || [[ "$port" == "" ]]; then
		# 	port=22
		# fi
		# keypath=$(rofi -dmenu -config "$CFG_DIR/$CFG_FILE" \
		# 	-l 1 -p "Enter path to private key (leave blank if not needed or if unsure):")

		printf "%s\n%s\n%d\n%s\n" "sudacode" "sudacode" 3005 "" | ani-cli -s
		# if [[ -z "$keypath" ]]; then
		# 	printf "%s\n%s\n%d\n%s\n" "$username" "$host" "$port" "" | ani-cli -s
		# else
		# 	printf "%s\n%s\n%d\n%s\n" "$username" "$host" "$port" "$keypath" | ani-cli -s
		# fi
		if [[ "$?" -ne 0 ]]; then
			log "Aniwrapper was unable to sync the databases..."
			exit 1
		else
			log "Databases synced successfully"
			exit 0
		fi
		;;
	6.)
		# ---------------------------------------------------------------------------
		# get out
		# ---------------------------------------------------------------------------
		printf "%s\n" "Quitting..."
		exit 0
		;;
	*)
		log "Invalid choice..."
		exit 1
		;;

esac
