package gc.mda.kcg.auth;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.password.PasswordEncoder;

import java.util.Map;

/**
 * 데모 계정 5종의 BCrypt 해시 시드/갱신 (시동 시 1회).
 * V006이 PLACEHOLDER로 계정을 만들었고, 이 Runner가 실제 해시를 채워넣음.
 *
 * 데모 계정 비밀번호 (LoginPage의 DEMO_ACCOUNTS와 동일):
 *   admin    / admin1234!
 *   operator / oper12345!
 *   analyst  / anal12345!
 *   field    / field1234!
 *   viewer   / view12345!
 *
 * 기존 해시가 PLACEHOLDER가 아니면 갱신하지 않음 (운영 중 비밀번호 변경 보존).
 */
@Slf4j
@Configuration
@RequiredArgsConstructor
public class AccountSeeder {

    private static final String PLACEHOLDER = "PLACEHOLDER_TO_BE_SEEDED";

    private static final Map<String, String> DEMO_PASSWORDS = Map.of(
            "admin",    "admin1234!",
            "operator", "oper12345!",
            "analyst",  "anal12345!",
            "field",    "field1234!",
            "viewer",   "view12345!"
    );

    @Bean
    public ApplicationRunner seedDemoAccounts(UserRepository userRepository, PasswordEncoder passwordEncoder) {
        return args -> {
            int updated = 0;
            for (Map.Entry<String, String> e : DEMO_PASSWORDS.entrySet()) {
                String acnt = e.getKey();
                String rawPw = e.getValue();
                userRepository.findByUserAcnt(acnt).ifPresent(user -> {
                    if (PLACEHOLDER.equals(user.getPswdHash())) {
                        user.setPswdHash(passwordEncoder.encode(rawPw));
                        userRepository.save(user);
                        log.info("데모 계정 BCrypt 해시 시드: {}", acnt);
                    }
                });
                if (userRepository.findByUserAcnt(acnt)
                        .map(u -> u.getPswdHash() != null && !PLACEHOLDER.equals(u.getPswdHash()))
                        .orElse(false)) {
                    updated++;
                }
            }
            log.info("AccountSeeder 완료: {}개 데모 계정 활성", updated);
        };
    }
}
