package com.erp.crosstenant;

import com.erp.tenant.DbContextHolder;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.http.HttpStatus;
import org.springframework.web.server.ResponseStatusException;

/**
 * Cross-tenant 어드민 엔드포인트 진입 가드.
 *
 * 정적 헬퍼 두 개. 컨트롤러는 이 둘을 호출해 boolean 으로 검사 후
 * 명시적으로 {@link org.springframework.http.ResponseEntity} 반환한다.
 * 예외 throw 방식을 안 쓰는 이유 — {@link com.erp.config.GlobalExceptionHandler} 의
 * catch-all 핸들러가 모든 예외를 500 으로 변환하므로, 가드 결과를 정확한 status code 로
 * 내려주려면 컨트롤러가 직접 결정해야 함.
 *
 * SecurityConfig 단계에서 매처로 가두지 않는 이유는 기존 95개 컨트롤러가
 * permitAll 로 동작 중이기 때문 ({@code SecurityConfig} L52~56 코멘트 참조).
 *
 * @see com.erp.crosstenant.CrossTenantAggregator
 * @see com.erp.tenant.DbContextHolder
 */
public final class CrossTenantContext {

    public static final String ROLE_SUPER_ADMIN = "SUPER_ADMIN";

    private CrossTenantContext() {}

    /**
     * JWT 가 세팅한 role attribute 가 SUPER_ADMIN 인지.
     * JwtAuthenticationFilter 가 토큰 검증 후 {@code request.setAttribute("role", userType)} 박음.
     * 토큰 없거나 role 미스매치면 false.
     */
    public static boolean isSuperAdmin(HttpServletRequest request) {
        Object role = request.getAttribute("role");
        return ROLE_SUPER_ADMIN.equals(role);
    }

    /**
     * 현재 요청이 META DB 컨텍스트인지.
     * SubdomainResolverFilter 가 admin.invyone.com / 메인 도메인일 때 setMeta() 박음.
     * 회사 도메인 (qnc.invyone.com 등) 에서 호출되면 false.
     */
    public static boolean isMetaContext() {
        return DbContextHolder.isMeta();
    }

    /**
     * 관리 호스트(solution.invyone.com / admin.invyone.com / localhost / 베이스 도메인) 외엔 거절.
     * cross-tenant 작업은 plane 격리상 관리 호스트에서만 허용. SuperAdminGuard.isTenantHost 와 동일 규칙.
     */
    public static void requireManagementHost(HttpServletRequest request) {
        String host = request.getHeader("Host");
        if (com.erp.provisioning.SuperAdminGuard.isTenantHost(host)) {
            throw new ResponseStatusException(HttpStatus.FORBIDDEN,
                    "Cross-tenant operations are only available on the management site");
        }
    }
}
