# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0

# Script Usage Validation

if [[ $# -lt 2 ]]; then
    echo 'USAGE: ./run_sample <APP_PLATFORM> <INSTRUMENTATION_TYPE>'
    exit -1
fi

if [[ $AWS_ACCESS_KEY_ID && $AWS_SECRET_ACCESS_KEY ]]; then
    echo 'AWS credentials found in environment variables.'
elif [ -d "$HOME/.aws/" ]; then
    echo 'AWS credentials NOT found in environment variables. Will attempt to mount ~/.aws instead.'
    DOCKER_MOUNT_AWS_CREDS_OPTION="-v $HOME/.aws:/.aws"
else
    echo 'AWS credentials NOT found in either environment variables or home directory. AWS calls will not work.'
fi

# Script Configuration

if [[ $APP_ENDPOINT ]]; then
    IFS=':'
    APP_ENDPOINT_ARRAY=($APP_ENDPOINT)
    unset IFS
    if [[ ${#APP_ENDPOINT_ARRAY[@]} -lt 2 ]]; then
        echo "App Endpoint $APP_ENDPOINT is not valid! Expected: <APP_HOST_NAME>:<APP_PORT>"
        exit -1
    fi
    APP_HOST_NAME=${APP_ENDPOINT_ARRAY[0]}
    APP_PORT=${APP_ENDPOINT_ARRAY[1]}
else
    APP_HOST_NAME=0.0.0.0
    APP_PORT=8080
fi

LISTEN_ADDRESS=$APP_HOST_NAME:$APP_PORT

OTEL_EXPORTER_ENV_VARS_CONFIG=''

if [[ $OTEL_EXPORTER_OTLP_ENDPOINT ]]; then
    OTEL_EXPORTER_ENV_VARS_CONFIG="$OTEL_EXPORTER_ENV_VARS_CONFIG -e OTEL_EXPORTER_OTLP_ENDPOINT=$OTEL_EXPORTER_OTLP_ENDPOINT"
else
    OTEL_EXPORTER_ENV_VARS_CONFIG="$OTEL_EXPORTER_ENV_VARS_CONFIG -e OTEL_EXPORTER_OTLP_ENDPOINT=172.17.0.1:4317"
fi

if [[ $OTEL_EXPORTER_OTLP_CERTIFICATE ]]; then
    OTEL_EXPORTER_ENV_VARS_CONFIG="$OTEL_EXPORTER_ENV_VARS_CONFIG -e OTEL_EXPORTER_OTLP_CERTIFICATE=$OTEL_EXPORTER_OTLP_CERTIFICATE"
fi

# Script Arguments Validation

# - App Platform
APP_PLATFORM="$1"
APP_PLATFORMS="flask"

if ! [[ $APP_PLATFORMS =~ (^|[[:space:]])"$APP_PLATFORM"($|[[:space:]]) ]]; then
    echo "<APP_PLATFORM> '$APP_PLATFORM' is not valid! Select from: $APP_PLATFORMS"
    exit -1
fi

# - Instrumentation Type
INSTRUMENTATION_TYPE="$2"
INSTRUMENTATION_TYPES="auto manual"

if ! [[ $INSTRUMENTATION_TYPES =~ (^|[[:space:]])"$INSTRUMENTATION_TYPE"($|[[:space:]]) ]]; then
    echo "<INSTRUMENTATION_TYPE> '$INSTRUMENTATION_TYPE' is not valid! Select from: $INSTRUMENTATION_TYPES"
    exit -1
fi

SCRIPT_PATH=$(dirname $0)
APP_PATH=$SCRIPT_PATH/$INSTRUMENTATION_TYPE-instrumentation/$APP_PLATFORM

# AWS OTel Python Specific Commands

if [[ $INSTRUMENTATION_TYPE = 'manual' ]]; then
    if [ -d $APP_PATH/opentelemetry-python-core ]; then
        rm -rf $APP_PATH/opentelemetry-python-core
    fi
    git clone git@github.com:open-telemetry/opentelemetry-python.git $APP_PATH/opentelemetry-python-core

    if [ -d $APP_PATH/opentelemetry-python-contrib ]; then
        rm -rf $APP_PATH/opentelemetry-python-contrib
    fi
    git clone git@github.com:open-telemetry/opentelemetry-python-contrib.git $APP_PATH/opentelemetry-python-contrib
fi

# Build & Run Docker Image

IMAGE_NAME="aws-observability/$INSTRUMENTATION_TYPE-instrumentation/$APP_PLATFORM/sample-app"
CONTAINER_NAME="aws_otel_$INSTRUMENTATION_TYPE-$APP_PLATFORM-app"
OLD_IMAGE_IDS=$(docker images -q $IMAGE_NAME)

if [[ $OLD_IMAGE_IDS ]]; then
    docker rmi --force $OLD_IMAGE_IDS >/dev/null
    echo "Images with IDs $OLD_IMAGE_IDS removed."
fi

docker build --tag $IMAGE_NAME $APP_PATH

docker run $DOCKER_MOUNT_AWS_CREDS_OPTION \
    -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \
    -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \
    -e LISTEN_ADDRESS=$LISTEN_ADDRESS \
    $OTEL_EXPORTER_ENV_VARS_CONFIG \
    --publish $APP_PORT:$APP_PORT \
    --name $CONTAINER_NAME \
    $IMAGE_NAME &

# Cleanup

captureInterruptFunc() {
    echo
    echo "run_sample.sh: Interrupt detected, removing created docker containers."

    CONTAINER_IDS=$(docker ps --filter "name=$CONTAINER_NAME" --format "{{.ID}}")

    if [ $CONTAINER_IDS ]; then
        docker kill $CONTAINER_IDS >/dev/null 2>&1
        docker rm $CONTAINER_IDS >/dev/null 2>&1
        echo "Containers with IDs $CONTAINER_IDS removed."
    else
        echo "No Containers were removed."
    fi

    exit
}

# - Capture interrupt signal to do cleanup

trap "captureInterruptFunc" INT

# Wait for User Termination

echo "Started sample app ($INSTRUMENTATION_TYPE-instrumentation, $APP_PLATFORM)."
echo "Stop at anytime with ^C."
while :; do
    sleep 5
done