#!/bin/bash

################################################################################
# Génère les fichiers HTML de mon site 
# 
# Copyright (C) 2022 rick G. <rick@gnous.eu>
# 
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
# 
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License along with
# this program. If not, see <https://www.gnu.org/licenses/>.
################################################################################

# liste des fichiers html à générer
#files="autres.html copaings.html index.html ou.html projets.html rss.html apropos.html"
files="lang"
tmpHeader="/tmp/header.html"
annexes="css img"

pathLinks="/home/site/a/"
target="www"
defaultLang="fr"
header="header.html"
footer="footer.html"
org=1

################################################################################
# Génère un message d'aide
################################################################################
function print_help {
    echo "usage : generate.sh [options] [<dossier>]"
    echo -e "\tgénère les fichiers HTML du site. Il est possible de changer"
    echo -e "\tle dossier de destination (www par défaut)."
    echo
    echo -e "\t-h\tgénère ce message et arrête le script."
    echo -e "\t-c\tnettoie les fichiers générés"
    echo -e "\t-o\tne génère pas les fichiers org"
    echo -e "\t-n\tgénère la langue dans le nom du fichier et non dans le chemin."
    echo -e "\t\t(example.org/fr/index.html -> example.org/index.fr.html)"
    echo -e "\t-d\tdéfini la langue par défaut (son index sera mit à la racine)"
    echo -e "\t-t\tlance un docker pour pouvoir tester le site"
}

###############################################################################
# Génère un fichier header propre à une langue
#
# $1 : le chemin vers le fichier header.link
###############################################################################
function generate_header {
    cat $header > $tmpHeader

    subtitle=$(sed -n -e "/%subtitle%/,/%endsubtitle%/p" $1 | sed -n -e "2p")
    sed -i -e "s/%subtitle%/$subtitle/g" $tmpHeader

    awk 'BEGIN {
            FS = ":"
            code = 0
        }
        {
            if ($0 ~ /^%links%$/) {
                code = 1
                next
            } else if ($0 ~ /^%endlinks%$/) {
                code = 0
            }

            if (code && $1 !~ /^#/) {
                gsub(/ $/, "", $1); gsub(/^ /, "", $2)
                print "            <a href=\""$1"\">"$2"</a>"
            }
        }' $1 >> $tmpHeader
    echo -e "        </div>\n" >> $tmpHeader
}

# vérification des arguments passés
if [[ $@ =~ "-h" ]]
then
    print_help
    exit 0
fi

if [[ $@ =~ "-c" ]]
then
    rm -rf www
    exit 0
fi

if [[ $@ =~ "-t" ]]
then
    docker build . --tag site && echo -e "\n\033[32mC-c pour quitter\033[0m\n" || exit 1

    docker run --rm -p 8080:80 site
    exit 0
fi

if [[ $@ =~ "-o" ]]
then
    org=0
fi

if [ -d $target ]
then
    # TODO demander à l'utilisateur
    rm -rf $target
fi

mkdir $target

for l in $(ls $files)
do
    generate_header lang/$l/header.link
    echo "Create folder $l in $target..."
    mkdir "$target/$l"
    for i in $(ls $files/$l)
    do
        echo "[$l] Generate $i..."
        file="$target/$l/$i"
        #cat $header > $file
        cat $tmpHeader > $file
        # on extrait le bloc contenant les link, on les enlève et rajoute
        # <link />
        # merci
        # https://www.theunixschool.com/2012/12/sed-10-examples-to-print-lines-from-file.html
        # https://stackoverflow.com/questions/68573654/copy-a-content-from-one-file-and-need-to-replace-in-another-file-using-sed
        # https://unix.stackexchange.com/questions/26284/how-can-i-use-sed-to-replace-a-multi-line-string
        # TODO pouvoir mettre plusieurs lignes link
        newHeader=$(sed -n -e "/%link%/,/%endlink%/p" $files/$l/$i | sed -e "/%link%/d;/%endlink%/d" -e 's/\//\\\//g' -e "i<link " -e 'a\ \\\/>' | tr -d "\n")

        # je suppose que s'il y a moins de 10 caractères, alors on ne prend pas
        # en compte le nouveau link.
        if [ $(echo $newHeader | wc -c) -lt 10 ]
        then
            sed -i -e "/%links%/d" $file
        else
            # pour bien aligner
            newHeader="\ \ \ \ \ \ \ \ $newHeader"
            sed -i -e "/%links%/a$newHeader" $file
        fi

        cat $files/$l/$i >> $file
        cat $footer >> $file
        # nettoyage des balises précédemment utilisées
        sed -i -e "/%links%/d" $file
        sed -i -e "/%link%/,/%endlink%/d" $file

        sed -i -e "s/img alt=\"$l/img id=\"choose\" alt=\"$l/" $file

        sed -i -e "s/%file%/$i/" $file
        sed -i -e "s/%gitfile%/lang\/$l\/$i/" $file
        sed -i -e "s/%lang%/$l/" $file
    done
done

echo "Copy $annexes in $target..."
cp -t $target -r $annexes

echo "Generate default index page..."
cp $target/$defaultLang/index.html $target
for c in $(awk 'BEGIN {
                    FS = "\n";
                    code = 0
                }
                {
                    if ($0 ~ /id="header-links"/) {
                        code = 1
                        next
                    } else if ($0 ~ /\/div/) {
                        code = 0
                    } if (code) {
                        print NR
                    }
                }' www/index.html)
do
   sed -i -e "$c s/href=\"/href=\"$defaultLang\//" $target/index.html
done

echo "Link Links (lul)"
ln -s $pathLinks $target

if [ $org -eq 1 ]
then
    echo "Generate org files..."
    emacs -u $USER --script publish.el
fi