#!/usr/bin/env bash

#
#    Copyright (c) 2020 Project CHIP Authors
#
#    Licensed 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.
#

set -x
env

app="$1"
sdkconfig_name="$2"
idf_target="$3"
root=examples/$app/esp32

shift 1

if [ -z "$app" ]; then
    echo "No mandatory app argument supplied!"
    exit 1
fi

supported_idf_target=("esp32" "esp32c3" "esp32c2" "esp32c6" "esp32s3" "esp32h2" "esp32p4")

if [ -z "$idf_target" ] || [[ ! "${supported_idf_target[*]}" =~ "$idf_target" ]]; then
    idf_target="esp32"
fi

source "$IDF_PATH/export.sh"
source "scripts/activate.sh"
# shellcheck source=/dev/null

rm -f "$root"/sdkconfig

(
    cd "$root"
    idf.py -D SDKCONFIG_DEFAULTS="$sdkconfig_name" set-target "$idf_target" build
) || {
    echo "build $sdkconfig_name failed"
    exit 1
}

# Figuring out ELF name:
#   - assume project(<NAME>) contains the name
#   - in case this is dynamic (e.g. all-devices-app does that), then
#     parse comments of the form `esp_example:project_name_choice:<NAME>`

choices=()

# Extract project name from project() call if it's a literal
project_name_fallback=$(grep -o 'project([^)]*)' "$root"/CMakeLists.txt | sed 's/project(\(.*\))/\1/')
if [ -n "$project_name_fallback" ] && [[ ! "$project_name_fallback" =~ \$ ]]; then
    choices+=("$project_name_fallback")
fi

# Extract choices from custom comments
while IFS= read -r line; do
    if [ -n "$line" ]; then
        choices+=("$line")
    fi
done < <(grep '# esp_example:project_name_choice:' "$root"/CMakeLists.txt | sed 's/.*# esp_example:project_name_choice:[[:space:]]*//')

# Find the newest elf file among choices
found_elf=""
found_elfs=()
for choice in "${choices[@]}"; do
    candidate="$root/build/$choice.elf"
    if [ -f "$candidate" ]; then
        found_elfs+=("$candidate")
        if [ -z "$found_elf" ] || [ "$candidate" -nt "$found_elf" ]; then
            found_elf="$candidate"
        fi
    fi
done

if [ "${#found_elfs[@]}" -gt 1 ]; then
    echo "WARNING: Multiple ELF files found (using newest: $found_elf):"
    for elf in "${found_elfs[@]}"; do
        echo "  $elf"
    done
fi

if [ -z "$found_elf" ]; then
    echo "No valid elf file found in $root/build/ among choices: ${choices[*]}"
    exit 1
fi

project_name=$(basename "$found_elf" .elf)

cp "$found_elf" "$root"/build/"${sdkconfig_name%".defaults"}"-"$project_name".elf
