#!/bin/bash

#defining variables
nerdfontsrepo='https://api.github.com/repos/ryanoasis/nerd-fonts'
aFontInstalled="False"
keepArchives="False"
distDir="$HOME/.local/share/fonts"
downDir="$HOME/Downloads/NerdFonts"
os=$(uname)

# help message
usage() {
    echo "getNF: A Better way to install NerdFonts"
    echo ""
    echo "Usage:"
    echo "-h print this help message and exit"
    echo "-k Keep the downloaded archives"
    echo ""
}

# setting flags
while getopts :hk option; do
    case "${option}" in
        h) usage && exit 0 ;;
        k) keepArchives="True" ;;
        *) usage && exit 0
    esac
done

# For Macs, need to set a few different things
if [[ "$os" == 'Darwin' ]]; then
    distDir="$HOME/Library/Fonts"
fi

# Check if the distDir and downDir exists, if it doesn't, create it
[ -d "$distDir" ] || mkdir -p "$distDir" && echo "Fonts Directory exists, good" 
[ -d "$downDir" ] || mkdir -p "$downDir" && echo "Download Fonts Directory exists, good" 

# get font names
nerdFonts=$(curl --silent "$nerdfontsrepo/contents/patched-fonts?ref=master" | \
                grep "name" | \
                awk -F":" '{print $2}' | \
                sed 's/["",]//g;/install\.ps1/d')

#get the latest release number from NerdFonts github repo
release=$(curl --silent "$nerdfontsrepo/releases/latest" | \
              grep -Po '"tag_name": "\K.*?(?=")')

# use fzf to select the fonts to be installed
listFonts=$(printf '%s\n' "${nerdFonts[@]}" | fzf -m)

#loop over the selected fonts in listFonts, download and install them
for i in $listFonts; do
    checkFont=$(fc-list | grep -i "$i")
    if [ -z "$checkFont" ]; then #If the font already is installed, skip it
	echo "$i font download started" &&
            pushd "$downDir" > /dev/null &&
	    #download the font
	    curl -LJO -\# "https://github.com/ryanoasis/nerd-fonts/releases/download/$release/$i.zip" \
		 -o "$i.zip" --create-dirs &&
	    echo "$i font download finished" &&
	    echo "$i font unziping started" &&
	    #Unzipe the downloaded archive
	    # unzip -qq "$downDir/$i.zip" -d "$distDir" &&
            unzip -qq "$i.zip" -d "$distDir" &&
	    echo "$i font unzipping finished" &&
	    echo "Font $i Installed" &&
	    installedFontName=$(curl --silent "$nerdfontsrepo/contents/patched-fonts/$i/Regular/complete?ref=master" | \
				    grep ".ttf" | \
				    awk -F ":" 'FNR == 1 {print $2}' | \
				    awk '{print $1}' | \
				    sed 's/"//g') &&
            #set this variable to true so that the font cache get's updated
            aFontInstalled=True && # We do this before the Additional info, so  even if it fails the font cache will be refreshed
            #Additional info, only if we can get the real font name
            if [ -n "$installedFontName" ]; then
                echo "$i provides:" &&
	        fc-list | grep -i "$installedFontName" | \
		    awk -F "/" '{print $7}' | \
		    sed 's/style\=//' |  \
		    awk -F ":" 'BEGIN {print "FONT NAME" " | " "FILE NAME" " | " "STYLE"} {print $2 " | " $1 " | " $3}' | \
            	    column -s "|" -t
            fi
            popd > /dev/null
    else
	echo "Font $i already installed"
    fi
done

# If a font was installed, Update the font cache and remove the archive
if [ "$aFontInstalled" = "True" ]; then
    echo "Regenerating fc-cache"
    fc-cache -f  2>&1 && echo "fc-cache: regeneration succeeded!"
    #check if the user hasn't chooen to keep the updated, if not, remove them
    if [ "$keepArchives" = "False" ]; then
        echo "Removing zip font files in $downDir" &&
	rm $downDir/*.zip
    else
	echo "The archive files are in $downDir"
    fi
fi

echo "All is done!"
