#!/bin/bash

if (( $EUID == 0 )); then
    echo "Do not run as root."
    exit 1
fi

if [ -z "$DISPLAY" ]; then
    export DISPLAY=:0.0
fi

# help function:
function printhelp {
    echo "usage examples:"
    echo "Download latest working cemu + cemuhook + graphic packs and install to ~/.cemu (default):"
    echo "./cemutil.sh -a"
    echo "Download latest cemu + cemuhook + graphic packs and install to ~/.cemu (default):"
    echo "./cemutil.sh -l"
    echo "Use local zips and install to ~/Documents/cemu:"
    echo "./cemutil.sh -c cemu.zip -h cemuhook.zip -g graphicpacks.zip -i ~/Documents/cemu"
    exit 1
}

function download {
    echo "Downloading ${cemu_version}"
    wget -q --show-progress -O cemutemp.zip http://cemu.info/releases/${cemu_version}.zip
    echo "Downloading latest cemuhook"
    wget -q --show-progress -O cemuhooktemp.zip $(curl -s https://cemuhook.sshnuke.net |grep .zip |awk -F '"' NR==2{'print $2'})
    echo "Downloading latest graphics packs"
    wget -q --show-progress -O gfxpacktemp.zip https://github.com$(curl https://github.com/slashiee/cemu_graphic_packs/releases |grep graphicPacks |awk -F '"' NR==1{'print $2'})
    echo "Downloading cemuhook shared fonts"
    wget -q --show-progress -O sharedFonts.zip https://github.com/HengiFettlich/cemutil/raw/master/sharedFonts.zip
    return
}

#Check installed software
declare -a reqsw=("wine" "bsdtar" "unzip" "glxinfo" "curl" "wget" "winetricks")
for i in "${reqsw[@]}"
do
    if ! [ -x "$(command -v $i)" ]; then
        echo "You must install $i"
        exit 1
    fi
done

if $(glxinfo | grep -q -e "NVIDIA"); then
	skipgfxcheck=1
fi

function checkgfxver {
    echo "Checking graphics packages are new enough. To skip this check, run with -f flag."
    if ! $(glxinfo | grep -q -e 'Mesa 18.2' -e 'Mesa 18.3' -e 'Mesa 18.4' -e 'Mesa 19'); then
        echo "You must install at least Mesa 18.2.0"
        exit 1
    fi
    
    if ! $(glxinfo | grep -q -e "LLVM 9" -e "LLVM 8" -e "LLVM 7"); then
        echo "You must install Mesa built with at least LLVM 7"
        exit 1
    fi
    
    if ! $(glxinfo | grep -q "4.5 (Compat"); then
        echo "Your hardware doesn't support the required OpenGL version."
        echo "You may attempt using MESA_GL_VERSION_OVERRIDE=4.4COMPAT in the LaunchCEMU script."
        echo "This isn't officially supported, and may cause heavy glitches or not work. Proceeding as usual..."
    fi
    return
}

#Check for args
if [[ ! $@ =~ ^\-.+ ]]
then
    printhelp;
fi

#Handle args
while getopts ":c:h:g:alfi:" opt; do
    case ${opt} in
        c )
            cemuzip=$OPTARG
            if [ ! -f "$cemuzip" ]; then
                echo "cemu zip doesn't exist"
                exit 1
            fi
        ;;
        h )
            cemuhookzip=$OPTARG
            if [ ! -f "$cemuhookzip" ]; then
                echo "cemuhook zip doesn't exist"
                exit 1
            fi
        ;;
        g )
            gfxpackzip=$OPTARG
            if [ ! -f "$gfxpackzip" ]; then
                echo "graphic packs zip doesn't exist"
                exit 1
            fi
        ;;
        a )
            cemu_version="cemu_1.15.12"
            download
        ;;
        l )
            cemu_version=$(curl -s http://cemu.info | grep -Po 'cemu_.+?(?=\.zip)')
            download
        ;;
        f )
            skipgfxcheck=1
        ;;
        i )
            instdir=$OPTARG
        ;;
        \? )
            printhelp
        ;;
        : )
            echo "Invalid option: $OPTARG requires an argument" 1>&2
            printhelp
        ;;
    esac
done
shift $((OPTIND -1))

#check gfx package vers
if [[ "$skipgfxcheck" == "" ]]; then
    checkgfxver
fi

#Set opts if unset
if [[ "$instdir" == "" ]]; then
    instdir=$HOME/.cemu
fi
if [[ "$cemuzip" == "" ]]; then
    cemuzip=cemutemp.zip
fi
if [[ "$cemuhookzip" == "" ]]; then
    cemuhookzip=cemuhooktemp.zip
fi
if [[ "$gfxpackzip" == "" ]]; then
    gfxpackzip=gfxpacktemp.zip
fi
if [[ "$sharedFonts" == "" ]]; then
    sharedFonts=sharedFonts.zip
fi

#Extract zips
echo "Extracting zips"
mkdir -p $instdir


#Unpack downloaded zips if applicable
if [ -f "$cemuzip" ]; then
    bsdtar -xf "$cemuzip" -s'|[^/]*/||' -C $instdir
fi
if [ -f "$cemuhookzip" ]; then
    unzip -q -o "$cemuhookzip" -d $instdir
fi
if [ -f "$gfxpackzip" ]; then
    rm -rf ${instdir}/graphicPacks/* #remove old versions of Graphic Packs to help with major changes
    unzip -q -o "$gfxpackzip" -d ${instdir}/graphicPacks/
fi

if [ -f "$sharedFonts" ]; then
    unzip -q -o "$sharedFonts" -d $instdir
fi

#Delete downloaded zips if applicable
if [ -f "gfxpacktemp.zip" ]; then
    rm -rf gfxpacktemp.zip
fi
if [ -f "cemutemp.zip" ]; then
    rm -rf cemutemp.zip
fi
if [ -f "cemuhooktemp.zip" ]; then
    rm -rf cemuhooktemp.zip
fi

if [ -f "sharedFonts.zip" ]; then
    rm -rf sharedFonts.zip
fi

#Configure wine prefix
echo "Configuring new wine prefix"
export WINEPREFIX=$(realpath $instdir)/wine
winetricks -q vcrun2017
winetricks settings win7

#Create cemuhook.ini, enabling cemuhook h264 as default
cat > $instdir/cemuhook.ini << EOF1
[Debug]
useH264Decoder = true
EOF1

#Create launch scripts
cat > LaunchCEMU << EOF1
#!/bin/bash
export WINEPREFIX="$(realpath $instdir)/wine"
#for cemuhook
export WINEDLLOVERRIDES="mscoree=;mshtml=;dbghelp.dll=n,b"

cd $(realpath $instdir)
mesa_glthread=true __GL_THREADED_OPTIMIZATIONS=1 vblank_mode=0 WINEESYNC=1 wine Cemu.exe "\$@"
EOF1
chmod +x LaunchCEMU

cat > LaunchCEMUgcn3BOTW << EOF1
#!/bin/bash
export WINEPREFIX="$(realpath $instdir)/wine"
#for cemuhook
export WINEDLLOVERRIDES="mscoree=;mshtml=;dbghelp.dll=n,b"

cd $(realpath $instdir)
R600_DEBUG=nohyperz mesa_glthread=true vblank_mode=0 WINEESYNC=1 wine Cemu.exe "\$@"
EOF1
chmod +x LaunchCEMUgcn3BOTW

echo "Successfully installed to $(realpath $instdir)"
echo "You may now run CEMU with LaunchCEMU written in this directory"
echo "You may place LaunchCEMU anywhere, and even pass arguments to it just like Cemu.exe on Windows"
echo "Note2: gcn3 (radeon 300-500 series) users should use the gcn3BOTW script for launching BOTW"
