#!/usr/bin/env bash
# 로컬 서버(API) 배포 — GitHub CI 우회. docker build → ECR → ECS 롤링.
# 기준: origin/<env> 브랜치의 최신 커밋(푸시된 것). 로컬 미커밋 변경은 안 올라감.
# 사용: ./deploy-api.sh <stg|prod>
# 준비물: AWS 자격증명(배포권한), docker(또는 docker.exe), git, python3, aws cli — README.md 참고
set -euo pipefail

ENV="${1:?사용: deploy-api.sh <stg|prod>}"
[[ "$ENV" =~ ^(stg|prod)$ ]] || { echo "env는 stg|prod 만 가능"; exit 1; }

export AWS_PROFILE="${AWS_PROFILE:-insuniverse-readonly}"
export AWS_REGION="${AWS_REGION:-ap-northeast-2}"
export AWS_DEFAULT_REGION="$AWS_REGION"

# docker 자동 탐지 (WSL이면 Windows docker.exe 사용)
DOCKER="$(command -v docker 2>/dev/null || true)"
if [ -z "$DOCKER" ] && [ -x "/mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe" ]; then
  DOCKER="/mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe"
fi
[ -z "$DOCKER" ] && { echo "❌ docker 를 찾을 수 없음 (README 준비물 참고)"; exit 1; }

# 이 스크립트가 속한 repo 루트 (이식 가능 — 하드코딩 경로 없음)
REPO="$(git -C "$(dirname "$(realpath "$0")")" rev-parse --show-toplevel)"
ACCT="$(aws sts get-caller-identity --query Account --output text)"
REG="$ACCT.dkr.ecr.$AWS_REGION.amazonaws.com"
ECR="insuniverse/$ENV/api"
CLUSTER="insuniverse-$ENV"
TD="insuniverse-$ENV-api"
WT="/tmp/iu-api-$ENV-deploy"

echo "▶ [$ENV] 서버 배포 (profile=$AWS_PROFILE)"
cd "$REPO"
git fetch origin -q "+refs/heads/$ENV:refs/remotes/origin/$ENV"
if git -C "$WT" rev-parse 2>/dev/null; then
  git -C "$WT" reset --hard "origin/$ENV" >/dev/null
else
  git worktree add -q "$WT" "origin/$ENV"
fi
cd "$WT"
TAG="$(git rev-parse HEAD)"
echo "  커밋: ${TAG:0:12}"

aws ecr get-login-password | "$DOCKER" login --username AWS --password-stdin "$REG" >/dev/null 2>&1
echo "  빌드..."
"$DOCKER" build --build-arg RUN_MODE=api -t "$REG/$ECR:$TAG" -f apps/api/dockerfile . >"/tmp/iu-api-build-$ENV.log" 2>&1 \
  || { echo "❌ 빌드 실패: /tmp/iu-api-build-$ENV.log"; tail -20 "/tmp/iu-api-build-$ENV.log"; exit 1; }
echo "  ECR 푸시..."
"$DOCKER" push "$REG/$ECR:$TAG" >/dev/null 2>&1

echo "  ECS 새 리비전..."
aws ecs describe-task-definition --task-definition "$TD" --query 'taskDefinition' > "/tmp/iu-td-$ENV.json"
IMG="$REG/$ECR:$TAG" ENVN="$ENV" python3 - <<'PY'
import json, os
env = os.environ['ENVN']; img = os.environ['IMG']
d = json.load(open(f'/tmp/iu-td-{env}.json'))
for c in d['containerDefinitions']:
    if c['name'] == 'api':
        c['image'] = img
for k in ['taskDefinitionArn','revision','status','requiresAttributes','compatibilities','registeredAt','registeredBy']:
    d.pop(k, None)
json.dump(d, open(f'/tmp/iu-td-{env}-new.json', 'w'))
PY
NEWREV="$(aws ecs register-task-definition --cli-input-json "file:///tmp/iu-td-$ENV-new.json" --query 'taskDefinition.taskDefinitionArn' --output text)"
echo "  서비스 롤링 배포..."
aws ecs update-service --cluster "$CLUSTER" --service api --task-definition "$NEWREV" --query 'service.serviceName' --output text >/dev/null
echo "✅ [$ENV] 서버 배포 완료 (리비전 ${NEWREV##*/}, 커밋 ${TAG:0:12})"
echo "   확인: curl -i https://$([ "$ENV" = prod ] && echo api || echo s-api).insuniverse.com/health   # 200=정상, 503=DB/Redis 이상"
