/**
 * wace_plm public.comm_code 전체 시드 로더
 *
 *  - src/seed/wace_comm_code.sql 안에 wace_plm 의 comm_code 733 행이 NOT EXISTS 패턴으로 들어있음.
 *  - 부팅 시 한 번 실행 → 비어있을 때만 적재되며, 이미 있으면 자연스럽게 skip.
 *  - 시드 후 「system-seed」 로 임시 박았던 placeholder 카테고리(0000099 등) 중 wace 가 동일 code_id 로
 *    제공한 항목은 의미적으로 중복이므로 제거(우리 placeholder).
 */
import { readFile } from "fs/promises";
import path from "path";
import { getPool } from "../database/db";
import { logger } from "../utils/logger";

// ts-node(개발): __dirname = src/services  → ../seed
// tsc 빌드(운영): __dirname = dist/services → ../../src/seed (tsc 가 .sql 을 복사하지 않으므로 src 를 직접 가리킴)
const CANDIDATE_PATHS = [
  path.resolve(__dirname, "../seed/wace_comm_code.sql"),
  path.resolve(__dirname, "../../src/seed/wace_comm_code.sql"),
];

async function readSeed(): Promise<string | null> {
  for (const p of CANDIDATE_PATHS) {
    try { return await readFile(p, "utf8"); } catch { /* try next */ }
  }
  return null;
}

export async function ensureWaceCommCodeSeed(): Promise<void> {
  const pool = getPool();
  try {
    // 시드 파일이 없으면 무시 (테스트/슬림 환경 대비)
    const sql = await readSeed();
    if (!sql) {
      logger.warn(`[waceCommCodeSeed] seed 파일 없음: ${CANDIDATE_PATHS.join(" | ")} — 건너뜀`);
      return;
    }

    // (1) 본 시드 적재 — INSERT … WHERE NOT EXISTS 로 idempotent
    await pool.query(sql);

    // (2) wace 가 동일 code_id 로 권위 데이터 제공 → 우리 system-seed placeholder 제거
    //     (writer='system-seed' 면서 wace 가 같은 code_id 를 가지고 있는 행만)
    const { rowCount } = await pool.query(`
      DELETE FROM comm_code AS me
       WHERE me.writer = 'system-seed'
         AND EXISTS (
           SELECT 1 FROM comm_code w
            WHERE w.code_id = me.code_id
              AND w.writer <> 'system-seed'
              AND w.objid <> me.objid
         )
    `);

    // (3) 적재된 카테고리/자식 수 로깅
    const cnt = await pool.query<{ total: string; cats: string; children: string }>(`
      SELECT COUNT(*)::text AS total,
             COUNT(*) FILTER (WHERE parent_code_id IS NULL OR parent_code_id='')::text AS cats,
             COUNT(*) FILTER (WHERE parent_code_id IS NOT NULL AND parent_code_id<>'')::text AS children
        FROM comm_code
    `);
    const r = cnt.rows[0];
    logger.info(
      `🌱 wace comm_code 시드 완료: 총 ${r?.total}건 (카테고리 ${r?.cats} / 자식 ${r?.children}), ` +
      `placeholder 정리 ${rowCount || 0}건`,
    );
  } catch (e: any) {
    logger.warn(`[waceCommCodeSeed] 적재 실패(계속 진행): ${e?.message?.slice(0, 300)}`);
  }
}
