<#--
  ~ Licensed to the Apache Software Foundation (ASF) under one or more
  ~ contributor license agreements.  See the NOTICE file distributed with
  ~ this work for additional information regarding copyright ownership.
  ~ The ASF licenses this file to You under the Apache License, Version 2.0
  ~ (the "License"); you may not use this file except in compliance with
  ~ the License.  You may obtain a copy of the License at
  ~
  ~     http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
-->
<#--
The latest docker compose use "-" as separator rather than '_' when generating container name
Use COMPOSE_COMPATIBILITY env to keep compatibility
Refer to https://github.com/docker/compose/commit/150fd4b8cfa39726e68c12fc0fd45ac4e0f20c5f
-->
export COMPOSE_COMPATIBILITY=1
compose_file="${docker_compose_file}"
project_name=$(echo "${build_id}" |sed -e "s/\.//g" |awk '{print tolower($0)}')
docker_container_name="${docker_container_name}_1"

<#noparse>
container_name="${project_name}_${docker_container_name}"

# Diagnostic: log docker compose version
docker compose version >&2 || true

echo "=== Starting docker compose ===" >&2
compose_output=$(docker compose -p ${project_name} -f ${compose_file} up -d 2>&1)
compose_exit=$?
echo "${compose_output}" >&2
if [[ ${compose_exit} -ne 0 ]]; then
    echo "docker compose up exited with code ${compose_exit}" >&2
fi

container_id=`docker ps -qf "name=${container_name}"`
if [[ -z "${container_id}" ]]; then
    echo "docker startup failure! container_name=${container_name} not found." >&2
    echo "=== docker ps -a ===" >&2
    docker ps -a >&2 || true
    echo "=== docker compose logs ===" >&2
    docker compose -p ${project_name} -f ${compose_file} logs 2>&1 >&2 || true
    # Create container.log with diagnostic info
    mkdir -p ${SCENARIO_HOME}/logs
    {
        echo "=== CONTAINER STARTUP FAILURE ==="
        echo "container_name=${container_name} was not found by docker ps"
        echo "compose_exit_code=${compose_exit}"
        echo "compose_output:"
        echo "${compose_output}"
        echo "=== docker ps -a ==="
        docker ps -a 2>&1 || true
        echo "=== docker compose logs ==="
        docker compose -p ${project_name} -f ${compose_file} logs 2>&1 || true
    } >${SCENARIO_HOME}/logs/container.log
    docker compose -p ${project_name} -f ${compose_file} kill 2>/dev/null || true
    docker compose -p ${project_name} -f ${compose_file} rm -f 2>/dev/null || true
    status=1
else
    status=`docker wait ${container_id}`

    [[ $status -ne 0 ]] && docker logs ${container_id} >&2
    # Recreate logs dir in case the container removed it via volume mount
    mkdir -p ${SCENARIO_HOME}/logs
    docker logs ${container_id} >${SCENARIO_HOME}/logs/container.log

    docker compose -p ${project_name} -f ${compose_file} kill
    docker compose -p ${project_name} -f ${compose_file} rm -f
fi
</#noparse>

${removeImagesScript}