#!/bin/bash
# version: 1.6.0-2

set -e

eval "$(echo "$@" | grep -o "[^= ]\+ *= *[^ =]\+" | sed 's/ *= */=/')"

: ${EVIANALYTICS_LOG_LEVEL="info"}
: ${EVIANALYTICS_POSTGRESQL_HOST="127.0.0.1"}
: ${EVIANALYTICS_POSTGRESQL_DBNAME="core"}
: ${EVIANALYTICS_POSTGRESQL_USERNAME="core"}
: ${EVIANALYTICS_POSTGRESQL_PASSWORD="core"}

#CONFIGURATION
########################################################################################################################################################################################################################################################################################################################
#########################EVI-ANALYTICS#########################
  #EVI-ANALYTICS REPO AND VERSION
  : ${EVI_DOCKER_REPO_FOR_ANALYTICS="hub.eltex-co.ru/evi"}

  #EVI-ANALYTICS CONFIG SECTION [api]
  : ${EVIANALYTICS_API_HOST="0.0.0.0"}
  : ${EVIANALYTICS_API_PORT="7400"}

  #EVI-ANALYTICS CONFIG SECTION [rpc]
  : ${EVIANALYTICS_RPC_HOST="0.0.0.0"}
  : ${EVIANALYTICS_RPC_PORT="7402"}

  #EVI-ANALYTICS CONFIG SECTION [events]
  : ${EVIANALYTICS_EVENTS_HOST="0.0.0.0"}
  : ${EVIANALYTICS_EVENTS_PORT="7404"}

  #EVI-ANALYTICS CONFIG SECTION [video-receiver]
  : ${EVIANALYTICS_VIDEO_RECEIVER_HOST="0.0.0.0"}
  : ${EVIANALYTICS_VIDEO_RECEIVER_PORT="7406"}

  #EVI-ANALYTICS CONFIG SECTION [peeper]
  : ${EVIANALYTICS_PEEPER_HOST="0.0.0.0"}
  : ${EVIANALYTICS_PEEPER_PORT="7452"}
  
  #EVI-ANALYTICS CONFIG SECTION [nn]
  : ${EVIANALYTICS_NN_MODELS_PATH="/opt/evi-analytics/models"}
  : ${EVIANALYTICS_NN_TRT_POOL_SIZES="1"}
  : ${EVIANALYTICS_NN_OV_POOL_SIZES="0"}
  : ${EVIANALYTICS_NN_USE_CPU="false"}
  : ${EVIANALYTICS_HWACCEL_VIDEO_DECODER="cpu"}

  #EVI-ANALYTICS CONFIG SECTION [ssl]
  : ${EVIANALYTICS_SSL_CERT_FILE="/opt/evi-analytics/cert/cert.crt"}
  : ${EVIANALYTICS_SSL_KEY_FILE="/opt/evi-analytics/cert/key.key"}
  : ${EVIANALYTICS_SSL_PEM=""}
  
  #EVI-ANALYTICS CONFIG SECTION [postgresql]
  : ${EVIANALYTICS_POSTGRESQL_PORT="5432"}

  #EVI-ANALYTICS CONFIG SECTION [log]
  : ${EVIANALYTICS_LOG_ROTATE_FILE_MAX_SIZE="8192"}
  : ${EVIANALYTICS_LOG_ROTATE_KEEP_FOR="0"}
  : ${EVIANALYTICS_LOG_ROTATE_FILE_COUNT="0"}
  : ${EVI_LOG_PART_PATH="/opt/evi-analytics/logs"}
  : ${EVIANALYTICS_LOG_FILE="${EVI_LOG_PART_PATH}/evi-analytics.log"}
  
  #EVI-ANALYTICS LABELS
  : ${EVI_PEEPER_METRIC_TITLE="evi-analytics"}
  : ${EVI_PEEPER_METRIC_VENDOR="ELTEX"}
  : ${EVI_PEEPER_METRIC_JOB="evi-analytics"}
  : ${EVI_PEEPER_METRIC_ENDPOINT="metrics"}
  : ${EVI_PEEPER_METRIC_PORT="${EVIANALYTICS_PEEPER_PORT}"}
  
  #EVI-ANALYTICS VOLUMES
  : ${EVI_EXTERNAL_LOG_PATH="/var/log/evi-analytics"}
  
########################################################################################################################################################################################################################################################################################################################

GetLatestTag(){
  local image="${1:-evi-analytics}"
  local tag_prefix="${2:-1.6.0}"

  local host="${EVI_DOCKER_REPO_FOR_ANALYTICS%%/*}"
  local repo_path="${EVI_DOCKER_REPO_FOR_ANALYTICS#*/}"

  local url="https://${host}/api/v2.0/projects/${repo_path}/repositories/${image}/artifacts?page_size=100"
  
  echo "Поиск тегов в: $url" >&2


  local json
  json=$(curl -s -k "$url")

  if [[ -z "$json" ]]; then
    echo "Ошибка: пустой ответ от registry" >&2
    return 1
  fi
  
  local tag
  tag=$(echo "$json" \
		| sed 's/,/\n/g' \
		| grep -i '"name":' \
		| sed -E 's/.*"name":"([^"]+)".*/\1/' \
		| grep -v "latest" \
		| sort -V \
		| grep "^1.6.0" \
		| tail -1 )

  if [[ -z "$tag" ]]; then
    echo "Ошибка: не найден тег для образа $image" >&2
    return 1
  fi

  echo "$tag"
}

EVI_VERSION_ANALYTICS=$(GetLatestTag "evi-analytics" "1.6.0")

# Set device section before EOF (gpu/cpu diff)
if [[ "${EVIANALYTICS_NN_USE_CPU}" == "false" ]]; then
    DEVICES_SECTION="      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu, utility, video, compute]"
else
    DEVICES_SECTION=""
fi

set +e
read -r -d '' COMPOSE <<EOF
name: evi-analytics 

services:
########################################################################################################
  evi-analytics:
    image: ${EVI_DOCKER_REPO_FOR_ANALYTICS}/evi-analytics:${EVI_VERSION_ANALYTICS}
    hostname: evi-analytics
    container_name: evi-analytics
    environment:
      EVIANALYTICS_API_HOST: "${EVIANALYTICS_API_HOST}"
      EVIANALYTICS_API_PORT: "${EVIANALYTICS_API_PORT}"

      EVIANALYTICS_RPC_HOST: "${EVIANALYTICS_RPC_HOST}"
      EVIANALYTICS_RPC_PORT: "${EVIANALYTICS_RPC_PORT}"

      EVIANALYTICS_EVENTS_HOST: "${EVIANALYTICS_EVENTS_HOST}"
      EVIANALYTICS_EVENTS_PORT: "${EVIANALYTICS_EVENTS_PORT}"

      EVIANALYTICS_VIDEO_RECEIVER_HOST: "${EVIANALYTICS_VIDEO_RECEIVER_HOST}"
      EVIANALYTICS_VIDEO_RECEIVER_PORT: "${EVIANALYTICS_VIDEO_RECEIVER_PORT}"

      EVIANALYTICS_PEEPER_HOST: "${EVIANALYTICS_PEEPER_HOST}"
      EVIANALYTICS_PEEPER_PORT: "${EVIANALYTICS_PEEPER_PORT}"

      EVIANALYTICS_NN_MODELS_PATH: "${EVIANALYTICS_NN_MODELS_PATH}"
      EVIANALYTICS_NN_TRT_POOL_SIZES: "${EVIANALYTICS_NN_TRT_POOL_SIZES}"
      EVIANALYTICS_NN_OV_POOL_SIZES: "${EVIANALYTICS_NN_OV_POOL_SIZES}"
      EVIANALYTICS_NN_USE_CPU: "${EVIANALYTICS_NN_USE_CPU}"

      EVIANALYTICS_SSL_CERT_FILE: "${EVIANALYTICS_SSL_CERT_FILE}"
      EVIANALYTICS_SSL_KEY_FILE: "${EVIANALYTICS_SSL_KEY_FILE}"
      EVIANALYTICS_SSL_PEM: "${EVIANALYTICS_SSL_PEM}"

      EVIANALYTICS_POSTGRESQL_HOST: "${EVIANALYTICS_POSTGRESQL_HOST}"
      EVIANALYTICS_POSTGRESQL_PORT: "${EVIANALYTICS_POSTGRESQL_PORT}"
      EVIANALYTICS_POSTGRESQL_DBNAME: "${EVIANALYTICS_POSTGRESQL_DBNAME}"
      EVIANALYTICS_POSTGRESQL_USERNAME: "${EVIANALYTICS_POSTGRESQL_USERNAME}"
      EVIANALYTICS_POSTGRESQL_PASSWORD: "${EVIANALYTICS_POSTGRESQL_PASSWORD}"

      EVIANALYTICS_LOG_LEVEL: "${EVIANALYTICS_LOG_LEVEL}"
      EVIANALYTICS_LOG_ROTATE_FILE_MAX_SIZE: "${EVIANALYTICS_LOG_ROTATE_FILE_MAX_SIZE}"
      EVIANALYTICS_LOG_ROTATE_KEEP_FOR: "${EVIANALYTICS_LOG_ROTATE_KEEP_FOR}"
      EVIANALYTICS_LOG_ROTATE_FILE_COUNT: "${EVIANALYTICS_LOG_ROTATE_FILE_COUNT}"
      EVIANALYTICS_LOG_FILE: "${EVIANALYTICS_LOG_FILE}"

      EVIANALYTICS_HWACCEL_VIDEO_DECODER: "${EVIANALYTICS_HWACCEL_VIDEO_DECODER}"

    labels:
      ru.eltex-co.image.title:    ${EVI_PEEPER_METRIC_TITLE}
      ru.eltex-co.image.vendor:   ${EVI_PEEPER_METRIC_VENDOR}
      ru.eltex-co.metrics.job:    ${EVI_PEEPER_METRIC_JOB}
      ru.eltex-co.metrics.path:   ${EVI_PEEPER_METRIC_ENDPOINT}
      ru.eltex-co.metrics.port:   ${EVI_PEEPER_METRIC_PORT}
    volumes:
      - ${EVI_EXTERNAL_LOG_PATH}:${EVI_LOG_PART_PATH}
      - evi-analytics-models:${EVIANALYTICS_NN_MODELS_PATH}
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    ports:
      - ${EVIANALYTICS_API_PORT}:${EVIANALYTICS_API_PORT}
      - ${EVIANALYTICS_RPC_PORT}:${EVIANALYTICS_RPC_PORT}
      - ${EVIANALYTICS_VIDEO_RECEIVER_PORT}:${EVIANALYTICS_VIDEO_RECEIVER_PORT}
      - ${EVIANALYTICS_EVENTS_PORT}:${EVIANALYTICS_EVENTS_PORT}
    deploy:
      restart_policy:
        condition: on-failure
        delay: 20s
        max_attempts: 20
        window: 120s
${DEVICES_SECTION}
    networks:
      - evi-analytics-network
      - internal
########################################################################################################      
volumes:
    evi-analytics-models:
      name: evi-analytics-models
      external: false
########################################################################################################
networks:
  evi-analytics-network:
    driver: bridge
    enable_ipv6: false
    external: false
    name: evi-analytics-network
  internal:
    driver: bridge
    enable_ipv6: false
    external: false
    internal: true
    name: internal
EOF

set -e

echo "$COMPOSE"

img=$(echo "$COMPOSE" | docker compose -f - images)

read -t 3 -p "Act: (1) - remove contaner and volume; (2) - Remove (1) and images (1/2) [default - only start]: " ANS || true

[[ "$ANS" -ge "1" ]] && {
  echo "$COMPOSE" | docker compose -f - down -v

  echo "CONTAINERS, VOLUMES AND NETWORKS DELETE."
  sleep 3
}

#Ошибка с удалением дубликатов контейнеров, так как они ссылаются на один и тот же образ!
[[ "$ANS" -ge "2" ]] && {

  echo "$img" | awk 'NR>1 {print $4}' | sort -u | while read -r image; 
  do
    echo "DELETE: $image"
    docker rmi -f "$image" || true
  done

  echo "IMAGES DELETE."
  sleep 3

}

echo "$COMPOSE" | docker compose -f - up -d --force-recreate

sleep 5

docker logs -n 100 $(docker ps --all --filter "name=evi-analytics" --format "{{.Names}}" | grep -x "evi-analytics")