#!/usr/bin/bash
# Copyright © 2018 TermySequence LLC
#
# SPDX-License-Identifier: GPL-2.0-only

progname=termyctl

usage () {
    echo "Usage: $progname [options] command [arg]"
    echo
    echo "Set TermySequence session attributes and environment variables"
    echo
    echo "Options:"
    echo "  --man Launch man page"
    echo "  --version Print version information"
    echo
    echo "Commands:"
    echo "  check-env"
    echo "  fix-env"
    echo "  reset-env"
    echo
    echo "  set-icon NAME"
    echo "  clear-icon"
    echo "  set-badge FORMAT"
    echo "  clear-badge"
    echo "  set-layout SPEC"
    echo "  clear-layout"
    echo "  set-fills SPEC"
    echo "  clear-fills"
}

if [[ $# -eq 0 ]]; then
    usage
    exit
fi

populate_env_vars() {
    # Version check
    if [ "${BASH_VERSINFO[0]}" -lt 4 -o "${BASH_VERSINFO[1]}" -lt 2 ]; then
        echo "error: bash 4.2 or greater is required to run this command" 1>&2
        exit 99
    fi

    IFS=$'\x1f'
    declare -ga env_names=($(termy-query get "env.names"))
    declare -ga env_cur=($(termy-query get "env.current"))
    declare -ga env_goal=($(termy-query get "env.goal"))
    declare -gA cur_map
    declare -gA goal_map

    for spec in "${env_cur[@]}"; do cur_map[${spec%%=*}]="${spec#*=}"; done
    for spec in "${env_goal[@]}"; do goal_map[${spec%%=*}]="${spec#*=}"; done
}

check_env() {
    populate_env_vars
    retval=0

    for name in "${env_names[@]}"; do
        color=32
        if [ ${goal_map[$name]+_} ]; then
            if [ ! ${cur_map[$name]+_} ]; then color=31; fi
            if [ ! ${!name+_} ]; then color=31; fi
            if [ "${cur_map[$name]}" != "${goal_map[$name]}" ]; then color=31; fi
            if [ "${cur_map[$name]}" != "${!name}" ]; then color=31; fi
        else
            if [ ${cur_map[$name]+_} ]; then color=31; fi
            if [ ${!name+_} ]; then color=31; fi
        fi

        if [ $color = 31 ]; then retval=1; fi
        echo -e "\033[${color}m●\033[m $name"

        echo -ne "\tShould be:\t\t"
        if [ ${goal_map[$name]+_} ]; then
            echo "'${goal_map[$name]}'"
        else
            echo unset
        fi

        echo -ne "\tIs thought to be:\t"
        if [ ${cur_map[$name]+_} ]; then
            echo "'${cur_map[$name]}'"
        else
            echo unset
        fi

        echo -ne "\tIs actually:\t\t"
        if [ ${!name+_} ]; then
            echo "'${!name}'"
        else
            echo unset
        fi
    done

    if [ $retval = 1 ]; then
        echo 1>&2
        echo "Use fix-env to print assignments suitable for shell eval" 1>&2
    fi
    return $retval
}

fix_env() {
    populate_env_vars

    for name in "${env_names[@]}"; do
        if [ ${goal_map[$name]+_} ]; then
            if [ ! "${!name+_}" -o "${goal_map[$name]}" != "${!name}" ]; then
                echo "$name='${goal_map[$name]}'; export $name;"
                echo "echo $progname: updated $name 1>&2;"
            fi
        else
            if [ ${!name+_} ]; then
                echo "unset $name;"
                echo "echo $progname: unset $name 1>&2;"
            fi
        fi
    done

    if [ "$(termy-query get env.dirty)" == 1 ]; then
        echo "$progname reset-env"
    fi
}

if [[ "$1" != --* ]]; then
    if [ ! "$TERMYSEQUENCE" ]; then
        echo "error: TERMYSEQUENCE not set. Is this a TermySequence terminal?" 1>& 2
        exit 99
    fi
fi

case $1 in
    --help)
        usage
        ;;
    --version)
        echo 1.1.4
        ;;
    --man)
        exec man $progname
        ;;
    check-env)
        check_env
        ;;
    fix-env)
        fix_env
        ;;
    reset-env)
        echo -ne "\033]1337;TermyResetEnv=\a"
        ;;
    set-icon)
        exec termy-query set "session.icon" "$2"
        ;;
    clear-icon)
        exec termy-query clear "session.icon"
        ;;
    set-badge)
        exec termy-query set "session.badge" "$2"
        ;;
    clear-badge)
        exec termy-query clear "session.badge"
        ;;
    set-layout)
        exec termy-query set "session.layout" "$2"
        ;;
    clear-layout)
        exec termy-query clear "session.layout"
        ;;
    set-fills)
        exec termy-query set "session.fills" "$2"
        ;;
    clear-fills)
        exec termy-query clear "session.fills"
        ;;
    *)
        echo "Unknown command $1" 1>&2
        exit 1
        ;;
esac
