#!/bin/bash

if [[ ${*} = --help || ${*} = -h ]]
then
    echo "Usage: ${0} <image> [<name>]"
    exit 0
fi

function sanitize_name
{
    tr -cs 'a-zA-Z0-9.-' '[-*]' \
        | sed -e 's|^[.-]*||' \
              -e 's|[.-]*$||' \
        | cut -c 1-63
}


function ask_yn
{
    local yn
    while read -p "${*} (yn) " -r yn; do
        case ${yn} in
            [Yy]*) return 0;;
            [Nn]*) return 1;;
            *) echo "Enter yes or no";;
        esac
    done
    return 2  # EOF
}


function docker_volume_exists
{
    # podman has a 'volume exists' command but docker doesn't
    "${docker}" volume ls -q | grep -Fxq "${1}"
}


function execmakenew
{
    if [[ ${VOLUME} ]]
    then
        if ! docker_volume_exists "${VOLUME}"
        then
            echo "Volume not found. Making a new volume."
            echo
            "${docker}" volume create "${VOLUME}"
        fi
    fi
    local hostname
    hostname=$(tr -d '.' <<<"${NAME}")
    hostname=${hostname%[.-]dc}.dc.local

    local -a args
    args+=(run -i -t)
    if [[ ${VOLUME} ]]; then
        args+=(-v "${VOLUME}:/data")
    fi
    if [[ -d ${SHARED} ]]; then
        args+=(-v "${SHARED}:/ContainerShare")
    fi

    if [[ ! ${TZ} ]]
    then
        TZ=$(readlink -f /etc/localtime | sed -e 's|/usr/share/zoneinfo/||')
    fi
    export TZ
    # args+=(-v /etc/localtime:/etc/localtime:ro)
    args+=(-e TZ="${TZ}")
    args+=(--name "${NAME}")
    args+=(--hostname "${hostname}")
    args+=(--label "devcontainer=true")
    args+=("${IMAGE}" "${COMMAND}")

    exec "${docker}" "${args[@]}"
    echo "Exec failed!"
    exit 255
}


case $# in
    2)  IMAGE=${1}
        if [[ ${IMAGE} != *:* ]]; then
            IMAGE=${IMAGE}:latest
        fi
        NAME=${2}
        if [[ $(sanitize_name <<<"${NAME}") != "${NAME}" ]]; then
            echo "Bad name ${NAME}"
            exit 2
        fi
        ;;
    1)  IMAGE=${1}
        if [[ ${IMAGE} != *:* ]]; then
            IMAGE=${IMAGE}:latest
        fi
        NAME=$(sanitize_name <<<"${IMAGE}")-dc
        ;;
    *)  echo "Invalid parameters. Run with --help"
        exit 2
        ;;
esac

VOLUME=${NAME}_data
SHARED=${HOME}/ContainerShare
COMMAND=/bin/bash

# ugh
if [[ ${IMAGE} = *alpine* || ${IMAGE} = *busybox* ]]
then
    COMMAND=/bin/sh
fi

# rootless_podman=false
if command -v podman &>/dev/null
then
    docker=podman
    # if [[ $(id -u) != 0 ]]
    # then
    #     rootless_podman=true
    # fi
elif command -v docker &>/dev/null
then
    docker=docker
else
    echo >&2 docker/podman not found
    exit 127
fi



psinfo=$("${docker}" ps -a | grep -E "\\s+${NAME}\$")
if [[ ! ${psinfo} ]]
then
    echo "Container does not exist. Making a new container."
    echo
    execmakenew
elif [[ ${psinfo} = *Up* ]]
then
    echo "Container is up and running. Exec'ing in."
    echo
    exec "${docker}" exec -i -t "${NAME}" "${COMMAND}"
    echo "Exec failed!"
    exit 255
elif [[ ${psinfo} = *Created* ]]
then
    echo "Container has been created but not started. Starting it."
    echo
    exec "${docker}" start -i -a "${NAME}"
    echo "Exec failed!"
    exit 255
elif [[ ${psinfo} = *Exited* ]]
then
    echo "Container has already exited. What do you want to do? Your choices are:"
    echo "  (R)estart and attach to container"
    echo "  (D)elete and recreate container"
    echo "  E(x)it"
    echo

    read -p "What now? (rdx) " -r
    case ${REPLY} in
        [rR])
            echo "Starting container."
            echo
            exec "${docker}" start -i -a "${NAME}"
            echo "Exec failed!"
            exit 255
            ;;
        [dD])
            if ! ask_yn "Ya sure?"
            then
                echo "OK. Never mind then."
                exit 1
            fi
            echo "Deleting container."
            echo
            "${docker}" rm "${NAME}"
            echo "Making a new container."
            echo
            execmakenew
            ;;
        [xX])
            echo "OK. Exiting."
            exit 0
            ;;
    esac
    echo "Unknown option. Exiting."
    exit 2
fi
