set -e

DOCKER_COMPOSE_NAME="pricechecker"
DOCKER_FILES_DIRECTORY="/opt/artix/docker/$DOCKER_COMPOSE_NAME"
DOCKER_REGISTRY_NAME="dockerregistry.artix.su"
DOCKER_REGISTRY="$DOCKER_REGISTRY_NAME:2443"

logToFile() {
    echo -e "`date '+%Y-%m-%d %H:%M:%S'` $1: $2" >> "$DOCKER_FILES_DIRECTORY/logs/install.log"
}

log() {
    logToFile "$1" "$2"
    echo -e "$2" > /dev/tty
}

askQuestion() {
    local MSG
    if [ -z "$(echo -e "${1}" | tr -d '[[:space:]]')" ]
    then
        MSG="Продолжить? (y/n)? "
    else
        MSG="$1 "
    fi

    local CHOICE
    while true
    do
        log INFO "$MSG"
        read -n 1 CHOICE < /dev/tty
        logToFile INFO "Выбор: $CHOICE"
        echo ""
        case "$CHOICE" in
        д|Д|y|Y|"" )
            return 0
            ;;
        н|Н|n|N )
            exit 1
            ;;
        esac
    done
}

requestValue() {
    local MSG="Задайте $1"
    if [ -n "$2" ]
    then
        MSG="$MSG, текущее значение: \"$2\""
    fi
    log INFO "$MSG"
    local VALUE
    read VALUE < /dev/tty
    VALUE="${VALUE:-$2}"
    logToFile INFO "Введено: $VALUE"
    echo "$VALUE"
}

setVariable() {
    echo -e "#$1\n$2=$3" >> "$DOCKER_FILES_DIRECTORY/.env"
}

requestVariable() {
    setVariable "$1" "$2" "$(requestValue "$1" "$3")"
}

checkPort() {
    [ -z "$(ss -H -t -l -n state listening "sport = :$1")" ]
}

rm -r -f "$DOCKER_FILES_DIRECTORY"
mkdir -p "$DOCKER_FILES_DIRECTORY/logs"

if [ "$DOCKER_REGISTRY_NAME" = "dockerregistry.artix.su" ]
then
    LINE="/etc/docker/certs.d"
    log INFO "Проверка наличия сертификата для $DOCKER_REGISTRY_NAME"
    if ! [ -d "$LINE" ]
    then
        log ERROR "Ошибка: Директория с сертификатами \"$LINE\" не найдена. Установка отменена"
        exit 1
    fi
    if ! [ -d "$LINE/$DOCKER_REGISTRY" ]
    then
        log ERROR "Ошибка: Сертификат для $DOCKER_REGISTRY_NAME не добавлен. Добавьте его. Установка отменена"
        exit 1
    fi
    
    LINE=$(date -d "$(: | openssl s_client -connect $DOCKER_REGISTRY -servername $DOCKER_REGISTRY_NAME 2>/dev/null \
        | openssl x509 -text \
        | grep 'Not After' \
        | awk '{print $4,$5,$7}')" '+%s')
    log INFO "Проверяем срок действия сертификата для $DOCKER_REGISTRY_NAME"
    if [ $(date +%s) -gt $LINE ]
    then
        log ERROR "Срок действия сертификата для $DOCKER_REGISTRY_NAME истёк $(date -d @$LINE '+%Y-%m-%d')"
        exit 1
    else
        log INFO "Срок действия сертификата истекает $(date -d @$LINE '+%Y-%m-%d')"
    fi
fi

setVariable "Docker registry" "DOCKER_REGISTRY" "$DOCKER_REGISTRY"

LINE="ca-certificates wget iproute2 software-properties-common"
log INFO "Устанавливаем $LINE"
apt-get update
apt-get install --no-install-recommends -y $LINE

LINE="deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
log INFO "Добавляем репозиторий $LINE"
wget -q -O- https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor > "/etc/apt/trusted.gpg.d/docker.gpg"
add-apt-repository "$LINE"

LINE="docker-ce docker-compose-plugin"
apt-get update
log INFO "Устанавливаем $LINE"
apt-get install --no-install-recommends -y $LINE

#Скачиваем скрипты для запуска
wget -q -r -nH --cut-dirs=999999 --no-parent --reject="index.html*" -P "$DOCKER_FILES_DIRECTORY" "https://update.artix.su/static/cs/install_scripts/stable/pricechecker/user/"
find "$DOCKER_FILES_DIRECTORY" -type f -not -name "*.*" -exec chmod +x \{\} \;

#Проверяем наличие контейнеров с прайчекером
LINE=($(docker ps -a -q -f "name=$DOCKER_COMPOSE_NAME"))
if [ ${#LINE[@]} -gt 0 ] && askQuestion "У вас уже есть контейнеры \"$DOCKER_COMPOSE_NAME\". Удалить их? (y - продолжить/n - выход)"
then
    log INFO "Удаляем контейнеры: ${LINE[*]}"
    docker rm -f ${LINE[*]}
fi

#Запрашиваем значения для переменных среды, используемых контейнером. Сразу уточняем, доступен ли порт
echo ""
LINE="8085"
while true
do
    LINE="$(requestValue "порт для запуска" "$LINE")"
    checkPort "$LINE" && break
    log WARN "Порт занят. Освободите порт \"$LINE\" или задайте другой чтобы продолжить"
    askQuestion "y - попробовать ещё раз/n - выход"
    checkPort "$LINE" && break
done
setVariable "порт для запуска" "SERVER_PORT" "$LINE"
requestVariable "часовой пояс" "SET_TIMEZONE" "UTC"
if [ "$DOCKER_REGISTRY_NAME" = "dockerregistry.artix.su" ]
then
    requestVariable "версия (latest - последняя)" "TAG" "latest"
else
    requestVariable "версия (test - последняя)" "TAG" "test"
fi
requestVariable "уровень логирования (возможны TRACE, DEBUG, INFO, WARN, ERROR)" "LOG_LEVEL" "INFO"
echo ""
log INFO "Содержимое файла .env:\n$(cat "$DOCKER_FILES_DIRECTORY/.env")"
echo ""

log INFO "Запуск $DOCKER_COMPOSE_NAME"
cd "$DOCKER_FILES_DIRECTORY"

docker compose up -d
log INFO "Ваши контейнеры:\n$(docker ps -f "name=$DOCKER_COMPOSE_NAME")"