#!/bin/bash

# Apps with `build: .` in their docker compose need their Dockerfile +
# source tree to live in the deployed container dir (where compose runs
# from), not just in the install template dir. dockerComposeSetupFile
# only copies the compose itself; this helper covers the rest.
#
# Auto-detect: if a Dockerfile exists in the install dir for the app,
# we copy every file/folder from install→deployed except docker-compose
# variants (already handled) and the .config (per-app config has its
# own copy lifecycle in dockerConfigSetupToContainer).
#
# Idempotent: re-running mirrors the latest install template. Safe to
# call on every install action.
dockerCopyBuildContext()
{
    local app_name="$1"
    local source_dir="$install_containers_dir$app_name"
    local target_dir="$containers_dir$app_name"

    if [[ -z "$app_name" ]]; then
        isError "dockerCopyBuildContext: app_name is empty."
        return 1
    fi
    if [[ ! -f "$source_dir/Dockerfile" ]]; then
        # Nothing to do — app uses a pre-built image.
        return 0
    fi
    if [[ ! -d "$target_dir" ]]; then
        isError "dockerCopyBuildContext: target $target_dir doesn't exist."
        return 1
    fi

    isNotice "Copying build context (Dockerfile + source)"

    # Use rsync if available so re-installs only diff what changed; fall
    # back to cp -R for systems without rsync. Either way we exclude the
    # files that have their own copy lifecycle.
    # --no-owner --no-group: don't carry the install template's ownership (the
    # repo clone is owned by the human user, uid ~1000) onto the deployed
    # container dir — the chown below sets the correct owner. Without this the
    # rsync re-stamps the WebUI tree as uid 1000 every install.
    if command -v rsync >/dev/null 2>&1; then
        runFileOp rsync -a --no-owner --no-group \
            --exclude="docker-compose.yml" \
            --exclude="docker-compose.${app_name}.yml" \
            --exclude="${app_name}.config" \
            --exclude="${app_name}.tools.json" \
            --exclude="${app_name}.svg" \
            --exclude="data" \
            "$source_dir/" "$target_dir/"
    else
        # Best-effort fallback. Copies everything then nukes the
        # excluded items in the target.
        runFileOp cp -R "$source_dir/." "$target_dir/"
        runFileOp rm -f "$target_dir/${app_name}.config" "$target_dir/${app_name}.tools.json"
    fi

    # runFileOp above wrote the tree AS the container owner (rootless: the docker
    # install user; rooted: the manager) with --no-owner so the repo-clone uid
    # isn't carried — no root, no chown needed.
    isSuccessful "Build context copied for $app_name."
}
