#!/usr/bin/env bash
# -*- coding: utf-8; mode: sh indent-tabs-mode: nil -*-
# SPDX-License-Identifier: AGPL-3.0-or-later

# shellcheck source=utils/lib.sh
source "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
source_dot_config

# ----------------------------------------------------------------------------
# config
# ----------------------------------------------------------------------------

# name of https://images.linuxcontainers.org
LINUXCONTAINERS_ORG_NAME="${LINUXCONTAINERS_ORG_NAME:-images}"
HOST_PREFIX="${HOST_PREFIX:-searx}"

TEST_IMAGES=(
    "$LINUXCONTAINERS_ORG_NAME:ubuntu/18.04"  "ubu1804"
    "$LINUXCONTAINERS_ORG_NAME:ubuntu/19.04"  "ubu1904"
    "$LINUXCONTAINERS_ORG_NAME:archlinux"     "archlinux"
    #"$LINUXCONTAINERS_ORG_NAME:fedora/31"     "fedora31"
    #"ubuntu-minimal:18.04"  "ubu1804"
    #"ubuntu-minimal:19.10"  "ubu1910"
)

REMOTE_IMAGES=()
LOCAL_IMAGES=()

for ((i=0; i<${#TEST_IMAGES[@]}; i+=2)); do
    REMOTE_IMAGES=("${REMOTE_IMAGES[@]}" "${TEST_IMAGES[i]}")
    LOCAL_IMAGES=("${LOCAL_IMAGES[@]}" "${TEST_IMAGES[i+1]}")
done

# ----------------------------------------------------------------------------
usage() {
# ----------------------------------------------------------------------------

    cat <<EOF

usage::

  $(basename "$0") build [hosts]
  $(basename "$0") delete [hosts]

build / delete
  build and/or delete all LXC hosts

all LXC hosts:
  ${LOCAL_IMAGES[@]}

EOF
    [ ! -z "${1+x}" ] &&  err_msg "$1"
}

main() {
    rst_title "LXC tooling box" part

    required_commands lxc || exit

    local _usage="unknown or missing $1 command $2"

    case $1 in
        --source-only)  ;;
        -h|--help) usage; exit 0;;

        build)
            sudo_or_exit
            case $2 in
                hosts) build_instances ;;
                *) usage "$_usage"; exit 42;;
            esac ;;
        delete)
            sudo_or_exit
            case $2 in
                hosts) delete_instances ;;
                *) usage "$_usage"; exit 42;;
            esac ;;
        *)
            usage "unknown or missing command $1"; exit 42;;
    esac
}

build_instances() {
    rst_title "Build LXC instances"
    lxc_copy_images_localy
    lxc_init_containers

    err_msg "WIP / sorry, not implemented yet :o"
}

delete_instances() {
    rst_title "Delete LXC instances"
    echo -en "\\nLXC hosts(s)::\\n\\n  ${LOCAL_IMAGES[*]}\\n" | $FMT
    if ask_yn "Do you really want to delete all images"; then
        lxc_delete_containers
    fi
}

lxc_copy_images_localy() {
    echo
    for ((i=0; i<${#TEST_IMAGES[@]}; i+=2)); do
        if lxc image info "local:${TEST_IMAGES[i+1]}" &>/dev/null; then
            info_msg "image ${TEST_IMAGES[i]} already copied --> ${TEST_IMAGES[i+1]}"
        else
            info_msg "copy image locally ${TEST_IMAGES[i]} --> ${TEST_IMAGES[i+1]}"
            lxc image copy "${TEST_IMAGES[i]}" local: \
                --alias  "${TEST_IMAGES[i+1]}" prefix_stdout
        fi
    done
    #lxc image list local:
}

lxc_delete_images_localy() {
    echo
    for i in "${LOCAL_IMAGES[@]}"; do
        info_msg "delete image 'local:$i'"
        lxc image delete "local:$i"
    done
    #lxc image list local:
}

lxc_init_containers() {
    echo
    for i in "${LOCAL_IMAGES[@]}"; do
        if lxc info "$HOST_PREFIX-$i" &>/dev/null; then
            info_msg "conatiner '$HOST_PREFIX-$i' already exists"
        else
            info_msg "create conatiner instance: $HOST_PREFIX-$i"
            lxc init "local:$i" "$HOST_PREFIX-$i"
        fi
    done
    #lxc list "$HOST_PREFIX"
}

lxc_delete_containers() {
    echo
    for i in "${LOCAL_IMAGES[@]}"; do
        if lxc info "$HOST_PREFIX-$i" &>/dev/null; then
            info_msg "stop & delete instance '$HOST_PREFIX-$i'"
            lxc stop "$HOST_PREFIX-$i" &>/dev/null
            lxc delete "$HOST_PREFIX-$i" | prefix_stdout
        else
            warn_msg "instance '$HOST_PREFIX-$i' does not exist / can't delete :o"
        fi
    done
    #lxc list "$HOST_PREFIX"
}


# ----------------------------------------------------------------------------
main "$@"
# ----------------------------------------------------------------------------