#!/bin/bash


function ucase
{
    echo "$1" | tr '[:lower:]' '[:upper:]'
}

function lcase
{
    echo "$1" | tr '[:upper:]' '[:lower:]'
}

function columnize
{
    cols=$2
    TMPFILE=$(mktemp -t $(basename $0).XXXXXX) || exit 1
    cat >>$TMPFILE
    if [[ $(wc -l $TMPFILE | awk '{print $1}') -gt 1 ]] ; then
        totcnt=$(wc -l $TMPFILE | awk '{print $1}')
        maxrows=$((($totcnt+$cols-1)/$cols))
        maxcols=$cols
        if [[ $maxcols -gt $totcnt ]] ; then
            maxcols=$totcnt
        fi
        cnt=0
        hdrln1="| $(ucase $1)  "
        hdrln2='|:-----'
        n=1
        while [[ $n -lt $maxcols ]] ; do
            hdrln1+=' |  '
            hdrln2+=' |:------'
            n=$(($n+1))
        done
        hdrln1+=' |'
        hdrln2+=' |'
        n=0
        while [[ $n -lt $maxrows ]] ; do
            lines[$n]=""
            n=$(($n+1))
        done
        col=0
        while IFS= read -r line; do
            if [[ $col != 0 ]] ; then
                lines[$cnt]+=" | "
            fi
            lines[$cnt]+="$line"
            cnt=$(($cnt+1))
            if [[ $cnt = $maxrows ]] ; then
                cnt=0
                col=$(($col+1))
            fi
        done <$TMPFILE
        rm -f $TMPFILE

        echo
        echo $hdrln1
        echo $hdrln2
        n=0
        while [[ $n -lt $maxrows ]] ; do
            echo "| ${lines[$n]} |"
            n=$(($n+1))
        done
    fi
}

function mkconstindex
{
    sed 's/([^)]*)//g' | sed 's/[^a-zA-Z0-9_.:$]//g' | awk -F ':' '{printf "[%s](%s#%s)\n", $3, $1, $3}'
}

function mkconstindex2
{
    sed 's/ *=.*$//' | sed 's/[^a-zA-Z0-9_.:$]//g' | awk -F ':' '{printf "[%s](%s#%s)\n", $2, $1, $2}'
}

function mkotherindex
{
    sed 's/([^)]*)//g' | sed 's/[^a-zA-Z0-9_.:$]//g' | awk -F ':' '{printf "[%s()](%s#%s)\n", $3, $1, $3}'
}

CHEAT_FILES=$(grep '^include' std.scad | sed 's/^.*<\([a-zA-Z0-9.]*\)>/\1/' | grep -v 'version.scad' | grep -v 'primitives.scad')

(
    echo '## Belfry OpenScad Library Cheat Sheet'
    echo
    echo '( [Alphabetic Index](Index) )'
    echo
    (
        grep -H '// Constant: ' $CHEAT_FILES | mkconstindex
        grep -H '^[A-Z$][A-Z0-9_]* *=.*//' $CHEAT_FILES | mkconstindex2
    ) | sort -u | columnize 'Constants' 6
    for f in $CHEAT_FILES ; do
        egrep -H '// Function: |// Function&Module: |// Module: ' $f | mkotherindex | columnize "[$f]($f)" 4
        echo
    done
) > BOSL2.wiki/CheatSheet.md