#!/usr/bin/env bash
# 격리 DB 적재 (컨테이너 rbac-live-mysql 을 새로 만든 뒤 한 번). 멱등이 아니다: up.sh 가 컨테이너가 없을 때만 부른다.
# 순서: 스키마 덤프 → 저장 함수 → 마이그레이션(누락 표) → adm_is_super → 권한 역할 · 합성 테넌트 · 형제 · AO 보강
#       → 권한 첫 버전(실제 적재 스크립트) → 묶음 2·3 수기 행 → 합성 계정 · 합성 메뉴.
# 마이그레이션은 파일마다 --force 로 돈다: 덤프에 이미 있는 칸을 다시 만드는 문장은 실패하고 나머지는 계속된다. 실패 목록은 logs/db-migrate.log.
set -euo pipefail
here=$(cd "$(dirname "$0")" && pwd)
. "$here/lib.sh"
load_env_live
set -a; . "$L/.env.live"; set +a   # DB 비밀번호 · AES 키 (up.sh 가 만든다, 0600)

export MYSQL_PWD="$DB_PASSWORD" MYSQL_ROOT_PASSWORD="$DB_PASSWORD"
# q1: 실패 시 멈춘다. qf: 마이그레이션 전용 (--force, 실패를 로그로 넘긴다)
q1() { docker exec -i -e MYSQL_PWD "$DB_NAME" mysql -h127.0.0.1 -uroot --default-character-set=utf8mb4 -N -B insuniverse "$@"; }
qf() { docker exec -i -e MYSQL_PWD "$DB_NAME" mysql -h127.0.0.1 -uroot --default-character-set=utf8mb4 -N -B --force insuniverse "$@"; }

echo "DB 컨테이너 기동"
docker run -d --name "$DB_NAME" -p "127.0.0.1:$DB_PORT:3306" \
  -e MYSQL_ROOT_PASSWORD -e MYSQL_DATABASE=insuniverse mysql:8.0.42 \
  --log-bin-trust-function-creators=1 --sql-mode="" --skip-log-bin --default-time-zone=+09:00 \
  --innodb-redo-log-capacity=16777216 >/dev/null
for i in $(seq 1 120); do
  docker exec -e MYSQL_PWD "$DB_NAME" mysql -h127.0.0.1 -uroot -e 'SELECT 1' >/dev/null 2>&1 && break
  sleep 1
done
docker exec -e MYSQL_PWD "$DB_NAME" mysql -h127.0.0.1 -uroot -e 'SELECT 1' >/dev/null

echo "스키마 · 저장 함수 적재"
q1 < "$SCHEMA_DIR/02-schema.sql"
q1 < "$SCHEMA_DIR/01-functions.sql"

# 덤프에 없는 표 (drizzle 스키마와 대조: tn_admin_audit · tn_agency_policy · tn_auth_permission · tn_sales_commission_deduction · tt_ddx_verdict 등)
echo "마이그레이션 적재 (--force, 실패는 db-migrate.log)"
: > "$L/logs/db-migrate.log"
MIGS="0028_ddx_verdict 0031_admin_audit 0031_ddx_verdict_premature_empty 0032_agency_policy 0032_sales_commission_deduction 0033_admin_audit_index 0033_settlement_evidence 0034_settlement_active_member 0035_report_send_log_sent_by 0036_auth_permission"
for m in $MIGS; do
  f="$OFF_SRV/drizzle/$m.sql"
  [ -f "$f" ] || { echo "마이그레이션 파일이 없다: $m" >&2; exit 1; }
  out=$(qf < "$f" 2>&1 || true)
  if [ -n "$out" ]; then echo "== $m" >> "$L/logs/db-migrate.log"; echo "$out" >> "$L/logs/db-migrate.log"; fi
done
n_err=$(grep -c '^ERROR' "$L/logs/db-migrate.log" || true)
echo "  마이그레이션 오류 줄 $n_err (대부분 이미 있는 칸 · 덤프 기준의 재생성 문장)"

# 최고관리자 칸 (지정 표지). 적재 스크립트 · 조회가 이 칸을 본다. 유일 · 검사 제약은 m10 과 같은 DDL.
q1 -e "ALTER TABLE tn_admin ADD COLUMN adm_is_super TINYINT NULL DEFAULT NULL, ADD UNIQUE KEY uq_tn_admin_adm_is_super (adm_is_super), ADD CONSTRAINT ck_tn_admin_adm_is_super CHECK (adm_is_super = 1)"

echo "역할 · 합성 테넌트 · 형제 · AO 보강"
q1 -e "INSERT INTO tn_auth (ath_id, ath_name) VALUES (1, '합성-전권묶음'), (2, '합성-조회묶음'), (3, '합성-일부묶음')"
M6C="$WT/.claude/meta/2026-10-21-admin-rbac-m6c/synthetic-tenants.sql"
M9C="$WT/.claude/meta/2026-10-23-admin-rbac-m9c/synthetic-ao-m9c.sql"
M9E="$WT/.claude/meta/2026-10-26-admin-rbac-m9e/sibling-fixture-m9e.sql"
q1 < "$M6C"
q1 < "$M9C"
q1 < "$M9E"


echo "합성 계정 · 합성 메뉴"
AES_SECRET="$AES_SECRET" BCRYPT_FROM="$OFF_SRV" OUT_SQL="$L/run/accounts.sql" OUT_TSV="$ACCOUNTS_TSV" OUT_TXT="$ACCOUNTS_TXT" \
  node "$here/gen-accounts.js"
q1 < "$L/run/accounts.sql"
rm -f "$L/run/accounts.sql"
node "$here/gen-menu.mjs" "$OFF_ADM" > "$L/run/menu.sql" 2> "$L/logs/gen-menu.log"
q1 < "$L/run/menu.sql"
rm -f "$L/run/menu.sql"
# stg 메뉴 사본이 있으면 그것으로 바꾼다 (2026-10-28 사용자 요청: 원래 메뉴 구성)
if [ -f "$L/db/stg-tn_menu.sql" ]; then "$L/db/restore-stg-menu.sh"; fi

# 권한 첫 버전 적재 (14 문서 E6): 칸 배정을 읽어 역할마다 코드를 정한다. 칸 배정(restore 뒤)이 있어야 한다.
echo "권한 첫 버전 적재 (묶음 1~3 · 칸 배정 기준 · 최고관리자 전용 제외)"
(cd "$OFF_SRV" && DB_HOST=127.0.0.1 DB_PORT="$DB_PORT" DB_USER=root DB_PASSWORD="$DB_PASSWORD" DB_DATABASE=insuniverse \
  npx ts-node -T -P tsconfig.json apps/api/src/seeds/permission-first-version.ts --ath-id 1,2,3 --apply) > "$L/logs/db-permission-seed.log" 2>&1 \
  || { echo "권한 적재 실패 (logs/db-permission-seed.log)" >&2; exit 1; }

echo "적재 확인"
q1 -e "SELECT CONCAT('admin=', (SELECT COUNT(*) FROM tn_admin), ' super=', (SELECT COUNT(*) FROM tn_admin WHERE adm_is_super=1), ' perm_ath1=', (SELECT COUNT(*) FROM tn_auth_permission WHERE ath_id=1 AND permission_code<>'__version__'), ' perm_ath2=', (SELECT COUNT(*) FROM tn_auth_permission WHERE ath_id=2), ' perm_ath3=', (SELECT COUNT(*) FROM tn_auth_permission WHERE ath_id=3), ' sentinel=', (SELECT COUNT(*) FROM tn_auth_permission WHERE ath_id=0 AND permission_code='__version__'), ' menu=', (SELECT COUNT(*) FROM tn_menu), ' menu_map=', (SELECT COUNT(*) FROM tn_menu_auth_map))"
