#!/bin/bash
#
# Functions to fetch languages.
#

LANGPACKSFOLDER='../../moodle-langpacks' # Langpacks will be downloaded here.
BUCKET='moodle-lang-prod'
MOODLEORG_URL='https://download.moodle.org/download.php/direct/langpack'
DEFAULT_LASTVERSION='4.2' # Update it every version.

# Checks if AWS is available and configured.
function check_aws {
    if [ ! -z $AWS_SERVICE ]; then
        return
    fi

    export AWS_SERVICE=1

    aws --version &> /dev/null
    if [ $? -ne 0 ]; then
        export AWS_SERVICE=0
        echo 'AWS not installed. Check https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html for more info.'
        return
    fi

    # In order to login to AWS, use credentials file or AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY vars.
    if [ ! -f ~/.aws/credentials ] && ([ -z "$AWS_ACCESS_KEY_ID" ] || [ -z "$AWS_SECRET_ACCESS_KEY" ]); then
        export AWS_SERVICE=0
        echo 'AWS Cannot authenticate. Use aws configure or set the proper env vars.'
        return
    fi
}

function list_aws_files {
    local folder="$1"
    check_aws

    if [ $AWS_SERVICE -eq 1 ]; then
        export AWS_FOLDERS=`aws s3 ls s3://$BUCKET/$1`
    else
        export AWS_FOLDERS=[]
    fi
}

# Get last version of Moodle to fetch latest languages.
function get_lang_version {
    if [ ! -z "${LANGVERSION}" ]; then
        return
    fi

    APP_VERSION=`jq -r '.versionname' ../moodle.config.json| cut -d. -f1-2`
    if [ ! -z $APP_VERSION ]; then
        export LANGVERSION=$APP_VERSION
        echo "Using app version $LANGVERSION"
        return
    fi

    list_aws_files ''
    LANGVERSION=''
    for folder in $AWS_FOLDERS; do
        if [ $folder != 'PRE' ]; then
            LANGVERSION=${folder/\//}
        fi
    done

    if [ ! -z "${LANGVERSION}" ]; then
        echo "Using last version $LANGVERSION detected"
        return
    fi

    LANGVERSION=$DEFAULT_LASTVERSION
    echo "Using default version $LANGVERSION"
}

# Create langfolder
function create_langfolder {
    if [ ! -d $LANGPACKSFOLDER ]; then
        mkdir $LANGPACKSFOLDER
    fi
}

# Get language list from the installed ones (will not discover new translations).
function get_language_folders {
    list_aws_files "$LANGVERSION/"

    langs=""
    for file in $AWS_FOLDERS; do
        if [[ "$file" == *.zip ]]; then
            file=${file/\.zip/}
            langs+="$file "
        fi
    done

    if [ -z "${langs}" ]; then
        # Get language list from the installed ones (will not discover new translations).
        echo "Fallback language list will only get current installation languages"
        langs=`jq -r '.languages | keys[]' ../moodle.config.json`
    fi
}

# Entry function to get a language file.
function get_language {
    lang=$1
    lang=${lang/-/_}

    get_lang_version

    create_langfolder

    echo "Getting $lang language"

    pushd $LANGPACKSFOLDER > /dev/null

    curl -s $MOODLEORG_URL/$LANGVERSION/$lang.zip --output $lang.zip > /dev/null
    size=$(du -k "$lang.zip" | cut -f 1)
    if [ ! -n $lang.zip ] || [ $size -le 1 ]; then
        echo "Wrong language name or corrupt file for $lang"
        rm $lang.zip

        popd > /dev/null
        return
    fi

    rm -R $lang > /dev/null 2>&1> /dev/null
    unzip -o -u $lang.zip > /dev/null

    # This is the AWS version to get the language but right now it's slower.
    # aws s3 cp s3://$BUCKET/$LANGVERSION/$lang.zip . > /dev/null

    rm $lang.zip
    popd > /dev/null
}

# Entry function to get all language files.
function get_languages {
    suffix=$1
    if [ -z $suffix ]; then
        suffix=''
    fi

    get_lang_version

    if [ -d $LANGPACKSFOLDER ]; then
        lastupdate=`date -r $LANGPACKSFOLDER +%s`
        currenttime=`date +%s`
        ellapsedtime=$((currenttime - lastupdate))
        if [ $ellapsedtime -lt 3600 ]; then
            echo 'Recently updated, skip update languages'
            return
        fi
    else
        create_langfolder
    fi

    get_language_folders

    for lang in $langs; do
        get_language "$lang"

        if [ ! -z $suffix ]; then
            get_language "$lang$suffix"
        fi
    done
}