package com.zioinfo.kintex.tenant;

/**
 * 요청별 테넌트(전시관) 컨텍스트 — ThreadLocal (PLANNING §1A-3 · §8-2).
 * <p>{@link TenantContextFilter}가 요청 처리 전에 해소한 {@code tenant_id}를 주입하고, 처리 후 정리한다.
 * 서비스/매퍼는 클라이언트 파라미터가 아닌 <b>이 컨텍스트</b>를 신뢰 원천으로 스코프한다(위조 차단, §8-2).
 *
 * <p>미설정(비 HTTP·테스트 등) 시 {@link #DEFAULT_TENANT}('KINTEX' = 테넌트 #1)로 폴백 →
 * 단일 테넌트 동작과 완전히 동일(회귀 0). 2단계에서 fail-closed 강제 전환은 설계 노트 참조.
 *
 * <p>표준(2026-07-12): 테넌트 코드는 대문자('KINTEX'). 해석·비교는 {@link #normalize(String)}로
 * 대문자 정규화 → 기존 발급 JWT(tid='kintex')·X-Tenant-Id 소문자 입력이 계속 동작한다(하위호환).
 */
public final class TenantContext {

    /** 기준 테넌트 #1(KINTEX). 스키마 DEFAULT 'KINTEX'·복합 PK 선두 컬럼과 일치. */
    public static final String DEFAULT_TENANT = "KINTEX";

    private static final ThreadLocal<String> HOLDER = new ThreadLocal<>();

    private TenantContext() {
    }

    /**
     * 테넌트 코드 정규화 — trim + 대문자. null/공백이면 null.
     * 표준 코드가 대문자이므로 소문자 입력('kintex')·레거시 JWT를 표준 코드로 매칭한다.
     */
    public static String normalize(String tenantId) {
        if (tenantId == null) {
            return null;
        }
        String v = tenantId.trim();
        return v.isEmpty() ? null : v.toUpperCase();
    }

    /** 해소된 테넌트 주입(필터 전용) — 대문자 정규화 저장. */
    public static void set(String tenantId) {
        HOLDER.set(normalize(tenantId));
    }

    /** 현재 테넌트 — 미설정 시 기준 테넌트('KINTEX')로 폴백(회귀 0). 항상 정규화된 값. */
    public static String currentTenantId() {
        String v = normalize(HOLDER.get());
        return v == null ? DEFAULT_TENANT : v;
    }

    /** 명시적으로 설정된 값(폴백 없음) — null 이면 미해소. 진단용. */
    public static String rawTenantId() {
        return HOLDER.get();
    }

    /** 요청 종료 시 정리(스레드 풀 누수 방지). */
    public static void clear() {
        HOLDER.remove();
    }
}
