#!/usr/bin/env bash
# 05-build — imagem nova ANTES do down; a viva é preservada em :previous.
# Também persiste a identidade no .env (nome do projeto + imagem por projeto) DEPOIS do
# backup, para que a próxima execução e o `make` usem o mesmo namespace.
set -Eeuo pipefail
# shellcheck source=../lib/common.sh
. "$(dirname "$0")/../lib/common.sh"

phase_begin "05-build"

project_resolve

if [ "$DRY_RUN" = 1 ]; then
    if ! env_has COMPOSE_PROJECT_NAME; then
        log "[dry-run] .env: COMPOSE_PROJECT_NAME=${PROJECT_NAME}"
    fi
    case "$(env_value PHP_IMAGE)" in
        '' | concordia/php-fpm) log "[dry-run] .env: PHP_IMAGE=${PHP_IMAGE}" ;;
    esac
else
    if ! env_has COMPOSE_PROJECT_NAME; then
        env_set COMPOSE_PROJECT_NAME "$PROJECT_NAME"
    fi
    case "$(env_value PHP_IMAGE)" in
        '' | concordia/php-fpm) env_set PHP_IMAGE "$PHP_IMAGE" ;;
    esac
fi

if docker image inspect "$PHP_IMAGE:$PHP_TAG" >/dev/null 2>&1; then
    run docker tag "$PHP_IMAGE:$PHP_TAG" "$PHP_IMAGE:previous"
    state_set PREVIOUS_IMAGE "$PHP_IMAGE:previous"
    log "imagem atual preservada em ${PHP_IMAGE}:previous"
elif [ "${#STACK_COMPOSE[@]}" -gt 0 ]; then
    # Primeira atualização após a ADR-055: a stack viva ainda usa a imagem antiga
    # (`concordia/php-fpm:local` ou um pin anterior). Preservá-la permite religar se o
    # novo up falhar, mesmo antes de existir uma imagem com o nome do projeto novo.
    old_id="$("${STACK_COMPOSE[@]}" ps -q php-fpm 2>/dev/null | head -1 || true)"
    if [ -n "$old_id" ]; then
        old_image="$(docker inspect -f '{{.Config.Image}}' "$old_id" 2>/dev/null || true)"
        if [ -n "$old_image" ]; then
            run docker tag "$old_image" "$PHP_IMAGE:previous"
            state_set PREVIOUS_IMAGE "$PHP_IMAGE:previous"
            log "imagem da stack viva (${old_image}) preservada em ${PHP_IMAGE}:previous"
        fi
    fi
fi

build_args=(build)
if [ "$BUILD_NO_CACHE" = 1 ]; then
    build_args+=(--no-cache)
fi
build_args+=(php-fpm)
run "${COMPOSE[@]}" "${build_args[@]}"

if [ "$DRY_RUN" = 0 ]; then
    image_id="$(docker image inspect -f '{{.Id}}' "$PHP_IMAGE:$PHP_TAG" 2>/dev/null || true)"
    [ -n "$image_id" ] || die "imagem ${PHP_IMAGE}:${PHP_TAG} não existe após o build"
    state_set IMAGE_ID "$image_id"

    phpv="$(docker run --rm --entrypoint php "$PHP_IMAGE:$PHP_TAG" -r 'echo PHP_VERSION;' 2>/dev/null | tr -d '\r\n' || true)"
    case "$phpv" in
        8.4.*)
            patch="${phpv#8.4.}"
            case "$patch" in '' | *[!0-9]*) die "PHP runtime inválido: '${phpv}'" ;; esac
            [ "$patch" -ge 27 ] || die "PHP ${phpv} < 8.4.27 (php2shell) — build rejeitado"
            ;;
        8.5.*)
            patch="${phpv#8.5.}"
            case "$patch" in '' | *[!0-9]*) die "PHP runtime inválido: '${phpv}'" ;; esac
            [ "$patch" -ge 12 ] || die "PHP ${phpv} < 8.5.12 (php2shell) — build rejeitado"
            ;;
        *) die "PHP runtime fora dos branches corrigidos (8.4.27+/8.5.12+): '${phpv}'" ;;
    esac
    ok "PHP ${phpv} · ${PHP_IMAGE}:${PHP_TAG} (${image_id:0:19}…)"
fi

phase_end
