package com.pandoli365.bibimbap.config;

import com.pandoli365.bibimbap.mapper.PermissionsMapper;
import com.pandoli365.bibimbap.security.PermissionKeys;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@Component
public class PermissionCatalogVerifier implements ApplicationRunner {

    private static final Logger log = LoggerFactory.getLogger(PermissionCatalogVerifier.class);

    private final PermissionsMapper permissionsMapper;

    public PermissionCatalogVerifier(PermissionsMapper permissionsMapper) {
        this.permissionsMapper = permissionsMapper;
    }

    @Override
    public void run(ApplicationArguments args) {
        // 시드(멱등): enum 전체 순회 — 멤버 추가 시 자동 동기되는 불변식
        for (PermissionKeys key : PermissionKeys.values()) {
            permissionsMapper.upsert(key.name(), key.displayName());
        }

        // 불일치 경고: DB 활성 키 중 코드 enum 에 없는 것 탐지
        Set<String> codeKeys = Arrays.stream(PermissionKeys.values())
                .map(PermissionKeys::name)
                .collect(Collectors.toSet());
        List<String> dbKeys = permissionsMapper.listActiveKeys();
        if (dbKeys != null) {
            for (String dbKey : dbKeys) {
                if (!codeKeys.contains(dbKey)) {
                    log.warn("[RBAC] DB permissions 에 코드 enum 에 없는 활성 권한 키 발견: {} — 코드 PermissionKeys 와 불일치", dbKey);
                }
            }
        }

        log.info("[RBAC] 권한 카탈로그 시드 완료: {} 키", PermissionKeys.values().length);
    }
}
