#!/bin/bash

BOARD_IP_ADDRESS=192.168.100.2
SSH_KEY_FILE="${ROOTDIR}/cache/ssh_key"
SSH_PUB_FILE="${ROOTDIR}/cache/ssh_key.pub"
SSH_OPTIONS="-oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no -i${SSH_KEY_FILE}"

function die
{
    echo "board: $@" >/dev/stderr
    exit 1
}

function try
{
    "$@" || die "$@ failed. Aborting."
}

function copy-key
{
    if [[ ! -f "${SSH_KEY_FILE}" ]]; then
        die "${SSH_KEY_FILE} not found -- run setup-key first."
    fi

    local ssh_pub_file_contents="$(cat ${SSH_PUB_FILE})"
    try ssh ${SSH_OPTIONS} -C mendel@${BOARD_IP_ADDRESS} " \
        mkdir -p /home/mendel/.ssh; \
        echo '${ssh_pub_file_contents}' >/home/mendel/.ssh/authorized_keys"
}

function command::setup-key
{
    if [[ ! -f "${SSH_KEY_FILE}" || ! -f "${SSH_PUB_FILE}" ]]; then
        rm -f "${SSH_KEY_FILE}" "${SSH_PUB_FILE}"
        echo "Generating SSH keyfile in ${SSH_KEY_FILE}..."
        try ssh-keygen -f "${SSH_KEY_FILE}" -N "" >/dev/null
    fi

    echo "Copying keyfile to board (you may be prompted for mendel's password -- it's 'mendel')..."
    copy-key
    echo "Done."
}

function command::install
{
    local package_partial="$1"; shift

    if [[ -z "${package_partial}" ]]; then
        die "Usage: board.sh install <package-partial-name>"
    fi

    local filename="${package_partial}"
    if [[ ! -f "${filename}" ]]; then
        filename=$(echo $PRODUCT_OUT/packages/*/$filename*.deb)

        if [[ ! -f "${filename}" ]]; then
            die "push: no such package ${filename}"
        fi
    fi

    copy-key
    try scp ${SSH_OPTIONS} -C "${filename}" mendel@${BOARD_IP_ADDRESS}:/tmp

    local basename=$(basename "${filename}")
    try ssh ${SSH_OPTIONS} -Ct mendel@${BOARD_IP_ADDRESS} "sudo /usr/sbin/mdt-install-package /tmp/${basename};"
}

function command::push
{
    local source_path="$1"; shift
    local dest_path="$1"; shift

    if [[ -z "${source_path}" || -z "${dest_path}" ]]; then
        die "Usage: board.sh pull <local-source> <remote-dest>"
    fi

    copy-key
    try scp ${SSH_OPTIONS} -C "${source_path}" "mendel@${BOARD_IP_ADDRESS}:${dest_path}"
}

function command::pull
{
    local source_path="$1"; shift
    local dest_path="$1"; shift

    if [[ -z "${source_path}" || -z "${dest_path}" ]]; then
        die "Usage: board.sh pull <remote-source> <local-dest>"
    fi

    copy-key
    try scp ${SSH_OPTIONS} -C "mendel@${BOARD_IP_ADDRESS}:${source_path}" "${dest_path}"
}

function command::shell
{
    if [[ ! -f "${SSH_KEY_FILE}" ]]; then
        die "${SSH_KEY_FILE} not found -- run setup-key first."
    fi

    copy-key

    if [[ ! -z "$@" ]]; then
        ssh ${SSH_OPTIONS} -Ct mendel@${BOARD_IP_ADDRESS} "$@"
    else
        ssh ${SSH_OPTIONS} -Ct mendel@${BOARD_IP_ADDRESS}
    fi
}

function command::reboot
{
    if [[ ! -f "${SSH_KEY_FILE}" ]]; then
        die "${SSH_KEY_FILE} not found -- run setup-key first."
    fi

    copy-key
    ssh ${SSH_OPTIONS} -Ct mendel@${BOARD_IP_ADDRESS} "sudo reboot"
}

function command::reboot-bootloader
{
    if [[ ! -f "${SSH_KEY_FILE}" ]]; then
        die "${SSH_KEY_FILE} not found -- run setup-key first."
    fi

    copy-key
    ssh ${SSH_OPTIONS} -Ct mendel@${BOARD_IP_ADDRESS} "sudo reboot-bootloader"
}

function command::help
{
    local subcommand="$1"; shift

    if [[ -z "${subcommand}" ]]; then
        echo "Usage: board.sh [<options>] <subcommand> [<subcommand-options>]"
        echo "Where <subcommand> is one of the following:"
        echo
        echo "    setup-key         - generate an ssh key and store it to the attached board."
        echo "    install           - install a deb from your product directory to the board."
        echo "    push              - upload a file somewhere to the board."
        echo "    pull              - download a file from the board."
        echo "    shell             - open a shell to the board."
        echo "    reboot            - reboot the board."
        echo "    reboot-bootloader - reboot the board into fastboot."
        echo "    help              - get help on subcommands."
        echo
        echo "Global options are"
        echo "    -i <filename>    - set the location of the identity filename"
        echo "    -a <ip-address>  - use an alternative IP address"
        echo "    -h               - show this help text"
        echo
        die "Use 'help <subcommand>' for more details."
    fi
}

function main
{
    local subcommand="$1"; shift

    if [[ -z "$ROOTDIR" ]]; then
        die "\$ROOTDIR is not defined. 'source build/setup.sh' first!"
    fi

    if ! which ssh >/dev/null || ! which scp >/dev/null; then
        die "ssh or scp not found -- please ensure they're installed."
    fi

    case "${subcommand}" in
        setup-key)         command::setup-key "$@" ;;
        install)           command::install "$@" ;;
        push)              command::push "$@" ;;
        pull)              command::pull "$@" ;;
        shell)             command::shell "$@" ;;
        reboot)            command::reboot ;;
        reboot-bootloader) command::reboot-bootloader ;;
        help|'')           command::help "$@" ;;

        *)
            die "Unknown subcommand '${subcommand}' -- try 'help'."
            ;;
    esac

    return 0
}

main "$@"
