#!/bin/bash

if [ $# -lt 1 ]
then
cat << HELP

clickhouse-docker -- open clickhouse-client of desired version in docker container (automatically removed after you exit bash shell).

EXAMPLE:
    - start latest version:
       clickhouse-docker latest

    - start version 20.1:
       clickhouse-docker 20.1

    - list available versions:
       clickhouse-docker list
HELP
exit
fi

param="$1"

if [ "${param}" = "list" ]
then
    # https://stackoverflow.com/a/39454426/1555175
    wget -nv https://registry.hub.docker.com/v1/repositories/clickhouse/clickhouse-server/tags -O -  | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n'  | awk -F: '{print $3}'
else
    docker pull clickhouse/clickhouse-server:${param}
    tmp_dir=$(mktemp -d -t ci-XXXXXXXXXX) # older version require /nonexistent folder to exist to run clickhouse client :D
    chmod 777 ${tmp_dir}
    set -e
    containerid=`docker run -v${tmp_dir}:/nonexistent -d clickhouse/clickhouse-server:${param}`
    set +e
    while :
    do
        # that trick with init-file allows to start clickhouse client inside bash shell (nice if you need exit to bash, check smth, and get back to clickhouse-client)
        docker exec -it ${containerid} bash -c 'bash --init-file <(echo "clickhouse client -m")'

        printf "\n\nYou exited the session. What next?\n"
        echo " [Q]uit and remove container."
        echo " [R]estart clickhouse and run clickhouse-client in shell again."
        echo "You can also hit Ctrl+C to exit and keep container running."

        while :
        do
            read -p "Quit or restart [Q/R]?" choice
            case "$choice" in
            q|Q|exit ) break 2;;
            r|R|restart ) echo "Restarting container ..."; docker restart ${containerid} > /dev/null; break 1;;
            * ) echo "I don't understand. Please type Q or R" ;;
            esac
        done
    done
    docker rm -f ${containerid} > /dev/null
    rm -rf ${tmp_dir}
fi