#!/usr/bin/zsh -f

dry_run=no
while getopts :dl OPT; do
    case $OPT in
        d|+d)
            dry_run=yes
            set -x
            ;;
        l)
            highlight  --list-scripts=langs
            exit 0
            ;;
        *)
            echo "usage: `basename $0` [+-d} [--] ARGS..."
            exit 2
    esac
done
shift `expr $OPTIND - 1`
OPTIND=1


# size=$(find $1 -printf '%s')
size=$(stat --format %s $1)
# todo: why is this a problem? especially in "outline" modes: like listing an archive.
# this limit should be per type. BIG zip files are ok, while html might be not!
if [ $size -gt 143000000 ];
then
    echo "too big for lessfilter" >&2
    return 1
fi


# HIGHLIGHT=(source-highlight --out-format=esc)

lang=
# echo $1
case "$1" in
    # *.log)
    #   # don't try the file(1) method!
    #   ;;
    *.[chC])
        lang=C
#        extension-handler "$1"
        ;;
    *.cpp | *.cc)
        lang=cc
        ;;
    *.json | *.lock)
        lang=json
        # source-highlight --src-lang=$lang --out-format=esc -i $1
        # exec json_pp -f json < $1
        ;;
    *.ipk)
        tar -Oxapf $1 ./control.tar.gz | tar -Ozxapf  - ./control
        tar -Oxapf $1 ./data.tar.gz |tar -tzapf -
        exit 0
        ;;
    *.ipk)
        # does not work anymore?
        ar p $1 data.tar.gz| tar -ztf -
        exit 0
        ;;
    *.rst)
        rst2man $1 | MAN_KEEP_FORMATTING=y exec man --local-file -
        ;;
    *.js)
        lang=js
        ;;

    *.kts | *.kt)
        lang=kotlin
        ;;
    Jenkinsfile | *.java | *.groovy)
        lang=java
        ;;
    *.apk | *.aar)
        unzip -l $1
        ;;
    CMakeLists* | *.cmake | *.cmake.in )
        lang=cmake
        ;;
    *Makefile* | *akefile* | *.mk | Kbuild )
        lang=makefile
        ;;
    *.patch|*.diff)
        lang=diff
        ;;
    *.pl |*.perl | *.pm )
        lang=perl
        ;;
    *.el | *.jl )
        lang=lisp
        ;;
    *.md)
        lang=markdown
        ;;
    *.toml )
       lang=toml
       ;;
    *.yml)
        lang=yaml
        ;;
    *.scm | *.kahua | *.ssi | *.ss )
        lang=lisp
        #scheme
        ;;
    *.sh | *.zsh)
        lang=shell
        ;;
    *.sql)
        lang=sql
        ;;
    *.ini | *.txt )
        lang=ini
        # shell
        ;;
    *.xml)
        lang=xml
        ;;
    *.py | *.gradle)
        lang=python
        ;;
    *.go )
       lang=go
       ;;
    *.rs )
       lang=rust
       ;;
    gradle.properties)
        lang=shell
        ;;
    *)
        # We don't handle this format.
        type=$(file --dereference --brief $1)
        #echo "------------------- $type"
        case "$type" in
            *shell* | *zsh*)
                lang=shell
                ;;
            *[Pp]erl* )
                lang=perl
                ;;
            *python*)
                lang=python
                ;;
            a\ /usr/bin/make\ -f\ script*)
                lang=Makefile
                ;;
            *Lisp/Scheme\ program*)
                lang=lisp
                ;;
            "makefile script, ASCII text"*)
                exec cat $1
                ;;
            Makefile|makefile\ script*)
                lang=Makefile
                ;;
            *diff*output* )
                lang=patch
                ;;
            XML\ 1.0\ document* )
                lang=xml
                ;;
            UTF-8\ Unicode\ text | ASCII\ English\ text | *ASCII\ text* )
                filename=$1
                set +e

                # Match by full pathname:
                expr match "^/" $filename > /dev/null
                # status=$?
                if [ $? = 0 ]; then
                    filename=$(pwd)/$filename
                fi
                case $filename in
                    /etc/*)
                        lang=shell
                        ;;
                    *)
                        # try:
                        if head -n 100 $filename | grep --quiet '^#'
                        then
                            lang=shell
                        elif head -n 100 $filename | grep --quiet '^\*[ *]'
                        then
                            lang=outline
                        else
                            autoload -Uz colors
                            colors
                            echo "$fg[green]"
                            exec cat $1

                            lang=shell
                            # exit 1;
                        fi
                esac
                ;;
            text )
                exit 1
                ;;
            *)
                exit 1;;
        esac
        ;;
esac


if [ $dry_run = yes ];
then
    echo "detected $1 AS $lang"
    echo "would run\n  highlight --out-format=xterm256 --input $1 --src-lang=$lang"
    exit 0
fi

typeset -A convert_langs
convert_langs=(
    shell sh
)

if  [ -n "${convert_langs[$lang]}" ];
then
    lang=${convert_langs[$lang]}
fi

if [ -n "$lang" ]
then
    if [[ $lang = outline ]];
    then
        hilite-outline $1
        exit 0
    fi
    # source-highlight --src-lang=$lang --out-format=esc -i $1
    # --syntax=$lang
    # highlight --list-scripts=langs
    exec highlight --out-format=xterm256 --input $1 --src-lang=$lang
fi


# No further processing by lesspipe necessary
exit 0
