package com.zioinfo.mall.integration;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 외부 GUARDiA 연동 응답 보안 새니타이저.
 *
 * <p>GUARDiA 보안 불변 규칙: 서버 자격증명(IP/SSH 계정/비밀번호 등)을
 * API 응답에 절대 노출하지 않는다. ITSM/ERP/CRM 응답을 Mall로 반환하기 전
 * 반드시 {@link #clean(Object)}를 호출한다.
 *
 * <p>Map/List 구조를 재귀적으로 순회하며 민감 필드를 제거한다.
 */
public final class ItsmSecuritySanitizer {

    /** 응답에서 완전 제거할 민감 필드 키 (대소문자 무시). */
    private static final Set<String> SENSITIVE_KEYS = Set.of(
        "ip_addr",
        "ssh_user",
        "os_pw_enc",
        "password",
        "ssh_key",
        "secret",
        "token",
        "card_no_enc",
        "account_no_enc"
    );

    private ItsmSecuritySanitizer() {
    }

    public static Object clean(Object data) {
        if (data instanceof Map<?, ?> map) {
            Map<String, Object> cleaned = new LinkedHashMap<>();
            for (Map.Entry<?, ?> entry : map.entrySet()) {
                String key = String.valueOf(entry.getKey());
                if (isSensitive(key)) {
                    continue;
                }
                cleaned.put(key, clean(entry.getValue()));
            }
            return cleaned;
        }
        if (data instanceof List<?> list) {
            List<Object> cleaned = new ArrayList<>(list.size());
            for (Object item : list) {
                cleaned.add(clean(item));
            }
            return cleaned;
        }
        return data;
    }

    private static boolean isSensitive(String key) {
        if (key == null) {
            return false;
        }
        return SENSITIVE_KEYS.contains(key.toLowerCase());
    }
}
