package kr.or.bok.rtgs.gucci

import org.slf4j.LoggerFactory
import org.springframework.boot.ApplicationRunner
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.security.crypto.password.PasswordEncoder
import org.springframework.stereotype.Component

/**
 * 자격증명 마이그레이션 — 기동 시 `app_user.secret` 중 **평문(BCrypt 아님)** 을 BCrypt 해시로 승격한다.
 * BCrypt 해시는 `$2`로 시작하므로 이미 해시면 건너뛴다(멱등). 시드/신규 사용자가 평문으로 들어와도
 * 다음 기동에 자동 해시되어 **평문 저장이 남지 않는다**. 운영에선 사용자 생성 시점에 해시 권장.
 */
@Component
class SecretMigrator(
    private val jdbc: JdbcTemplate,
    private val encoder: PasswordEncoder,
) : ApplicationRunner {
    private val log = LoggerFactory.getLogger(javaClass)

    override fun run(args: org.springframework.boot.ApplicationArguments?) {
        val plain = jdbc.queryForList(
            "SELECT username, secret FROM app_user WHERE secret IS NOT NULL AND secret NOT LIKE '\$2%'",
        )
        if (plain.isEmpty()) return
        var n = 0
        for (r in plain) {
            val u = r["username"] as String
            val raw = r["secret"] as String
            jdbc.update("UPDATE app_user SET secret = ? WHERE username = ?", encoder.encode(raw), u)
            n++
        }
        log.warn("자격증명 마이그레이션: 평문 {}건 → BCrypt 해시로 승격", n)
    }
}
