#!/usr/bin/env bash
# 사용: bash env-apply.sh <stg|prod> <앵커 키> <삽입할 줄 파일>
# 앵커 키 줄 바로 뒤에 삽입한다(앵커가 마지막 줄이면 앞에 넣는다 — 원본 끝 줄바꿈 없음).
set -euo pipefail
umask 077
st=$1 anchor=$2 add=$3
P=(--profile inpas)
B=insuniverse-$st-envs K=api/$st.env
d=$(dirname "$0")
cur=$d/$st.cur new=$d/$st.new back=$d/$st.back

etag=$(aws s3api head-object "${P[@]}" --bucket "$B" --key "$K" --query ETag --output text)
aws s3api get-object "${P[@]}" --bucket "$B" --key "$K" --if-match "$etag" "$cur" >/dev/null

# 이미 있는 키는 넣지 않는다
while IFS= read -r line; do
  k=${line%%=*}
  if grep -q "^$k=" "$cur"; then echo "이미 있음: $k — 중단"; exit 1; fi
done < "$add"

n=$(grep -n "^$anchor=" "$cur" | cut -d: -f1)
[ "$(echo "$n" | wc -l)" = 1 ] && [ -n "$n" ] || { echo "앵커 $anchor 가 정확히 1줄이 아니다"; exit 1; }
total=$(wc -l < "$cur")
if [ "$n" -le "$total" ]; then sed "${n}r $add" "$cur" > "$new"; else sed "$((n-1))r $add" "$cur" > "$new"; fi

# 바뀐 것은 삽입 줄뿐이어야 한다
added=$(diff "$cur" "$new" | grep -c '^>' || true)
removed=$(diff "$cur" "$new" | grep -c '^<' || true)
want=$(wc -l < "$add")
[ "$added" = "$want" ] && [ "$removed" = 0 ] || { echo "diff 이상: +$added -$removed (기대 +$want -0)"; exit 1; }

ts=$(date -u +%Y%m%dT%H%M%SZ)
aws s3api copy-object "${P[@]}" --bucket "$B" --copy-source "$B/$K" --key "api/backups/$st.env-before-insight-ddx-split-$ts" --server-side-encryption AES256 >/dev/null
aws s3api put-object "${P[@]}" --bucket "$B" --key "$K" --body "$new" --if-match "$etag" --server-side-encryption AES256 >/dev/null
aws s3api get-object "${P[@]}" --bucket "$B" --key "$K" "$back" >/dev/null
cmp "$new" "$back"
echo "반영 완료: $st (+$added 줄, 백업 api/backups/$st.env-before-insight-ddx-split-$ts)"
grep -n -E '^(DDX_|INSIGHT_)' "$back" | awk -F= '{k=$1; v=substr($0,length(k)+2); if (k ~ /URL/) print k"="v; else print k"=<len "length(v)">"}'
rm -f "$cur" "$new" "$back"
