#!/bin/bash

set -e

update_linguas() {
    local DIR="$1"
    local LINGUAS_FILE="$DIR/LINGUAS"
    echo "update $LINGUAS_FILE"
    ls -1 "$DIR"/*.po | while read FILE; do
        basename -s .po "$FILE";
    done > "$LINGUAS_FILE"
}

firstword() {
    echo "$1"
}

read_linguas() {
    local FILE="$1"
    echo " - read $FILE"
    while read LINE; do
        local CODE="$(firstword $LINE)"
        if [ ! -z "$CODE" ]; then
            CODE_MAP[$CODE]="$CODE"
            NAME_MAP[$CODE]=""
            COMMENT_MAP[$CODE]=" <------- TODO: Set language name and remove this comment"
        else
            echo "$LINE" >> "$TMPFILE"
        fi
    done < "$FILE"
}

update_languages_inc() {
    local LANGUAGES_FILE="synfig-studio/src/languages.inc.c"
    echo "update LANGUAGES_FILE"

    local TMPFILE="$LANGUAGES_FILE.process"
    rm -f "$TMPFILE"

    declare -A CODE_MAP
    declare -A NAME_MAP
    declare -A COMMENT_MAP

    read_linguas "synfig-core/po/LINGUAS"
    read_linguas "synfig-studio/po/LINGUAS"

    echo " - read $LANGUAGES_FILE"
    while read LINE; do
        local COMMENT="$(echo "$LINE" | sed "s|//|#|" | cut -d \# -f 2- -s)"
        local SUBLINE="$(echo "$LINE" | sed "s|//|#|" | cut -d \# -f 1)"
        local CODE="$(echo "$SUBLINE" | cut -d \" -f 2)"
        local NAME="$(echo "$SUBLINE" | cut -d \" -f 4)"
        if [ ! -z "$CODE" ] || [ ! -z "$NAME" ]; then
            CODE_MAP[$CODE]="$CODE"
            NAME_MAP[$CODE]="$NAME"
            COMMENT_MAP[$CODE]="$COMMENT"
        else
            # write all unknown rows to begining of file
            echo "$LINE" >> "$TMPFILE"
        fi
    done < "$LANGUAGES_FILE"

    # fit the colums to make beautifulest table in the world
    local CODE_LEN=0
    local NAME_LEN=0
    for i in ${!CODE_MAP[@]}; do
        if [ ${#CODE_MAP[$i]} -gt $CODE_LEN ]; then
            CODE_LEN=${#CODE_MAP[$i]}
        fi
        if [ ${#NAME_MAP[$i]} -gt $NAME_LEN ]; then
            NAME_LEN=${#NAME_MAP[$i]}
        fi
    done
    CODE_LEN=$((CODE_LEN+3))
    NAME_LEN=$((NAME_LEN+3))

    # sort
    SORTED=$(for i in ${!CODE_MAP[@]}; do echo $i; done | sort | while read l; do echo -n "$l "; done)

    # write languages
    NEW_LANGS=
    for i in $SORTED; do
        CODE=${CODE_MAP[$i]}
        NAME=${NAME_MAP[$i]}
        COMMENT=${COMMENT_MAP[$i]}
        if [ ! -z "$COMMENT" ]; then
            COMMENT=" // $COMMENT"
        fi
        if [ -z "$NAME" ]; then
            NEW_LANGS="$NEW_LANGS $CODE"
        fi
        printf "{ %-${CODE_LEN}s %-${NAME_LEN}s },%s\\n" "\"$CODE\"," "\"$NAME\"," "$COMMENT" >> "$TMPFILE"
    done

    # update file
    mv $TMPFILE $LANGUAGES_FILE

    if [ ! -z "$NEW_LANGS" ]; then
        echo ""
        echo "please, enter names for following languages:$NEW_LANGS"
        echo ""
        echo "see file $LANGUAGES_FILE"
        echo ""
    fi
}


cd "$(cd `dirname "$0"`; pwd)/.."

update_linguas "synfig-core/po"
update_linguas "synfig-studio/po"
update_languages_inc
echo "done"
