package com.eactive.eai.rms.onl.apim.authserver;

import com.eactive.eai.agent.command.CommonCommand;
import com.eactive.eai.rms.common.datasource.DataSourceContextHolder;
import com.eactive.eai.rms.common.datasource.DataSourceType;
import com.eactive.eai.rms.common.datasource.DataSourceTypeManager;
import com.eactive.eai.rms.onl.apim.common.BaseRestController;
import com.eactive.eai.rms.onl.common.service.AgentUtilService;
import com.eactive.eai.rms.onl.manage.authserver.client.ClientManService;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 포털 등 내부 시스템이 호출하는 인증서버(GW) 클라이언트 제어용 내부 API.
 *
 * <p>{@link BaseRestController} 를 상속하여 ① 세션 인증을 skip(InterceptorSkipController)하고
 * ② {@code IpWhitelistInterceptor} 를 통해 {@code kjb.api.allow_ip_list} 기준 IP 화이트리스트
 * 인증을 적용받는다. (호출 측 포털 서버 IP를 반드시 허용목록에 등록해야 함)</p>
 *
 * @see com.eactive.eai.rms.common.interceptor.IpWhitelistInterceptor
 */
@Controller
public class ClientBlockApiController extends BaseRestController {

    private static final Logger logger = LoggerFactory.getLogger(ClientBlockApiController.class);

    private final ClientManService clientManService;

    @Qualifier("onlAgentUtilService")
    @Autowired
    private AgentUtilService agentUtilService;

    @Autowired
    public ClientBlockApiController(ClientManService clientManService) {
        this.clientManService = clientManService;
    }

    /**
     * clientId 의 GW 인증 클라이언트를 차단(TSEAIAU01.appstatus = '0')한 뒤,
     * 승인 경로와 동일하게 GW 인증서버로 RELOAD_CLIENT 명령을 broadcast 하여 캐시를 갱신한다.
     *
     * @param clientId 차단할 클라이언트 ID
     * @return 처리 결과 JSON ({@code {"success":true,"clientId":...}} 또는 {@code {"success":false,"msg":...}})
     */
    @RequestMapping(value = "/onl/admin/authserver/clientBlock.json", method = RequestMethod.POST, produces = JSON_CONTENT_TYPE)
    @ResponseBody
    public String blockClient(@RequestParam String clientId) {
        Map<String, Object> result = new HashMap<>();
        try {
            // TSEAIAU01(ClientEntity)은 APIGW 데이터소스에 있으므로 라우팅을 먼저 설정한다.
            DataSourceType type = DataSourceTypeManager.getDataSourceType("APIGW");
            DataSourceContextHolder.setDataSourceType(type);

            // 상태 차단 (appstatus = '0')
            clientManService.blockClient(clientId);

            // GW 인증서버 캐시 리로드 (승인 경로 PortalAppApprovalListener 와 동일)
            CommonCommand.builder()
                .name(CommonCommand.RELOAD_CLIENT_COMMAND)
                .args(clientId)
                .build().broadcast(agentUtilService);

            logger.warn("GW client 차단(appstatus=0)+리로드 완료 - clientId={}", clientId);
            result.put("success", true);
            result.put("clientId", clientId);
        } catch (Exception e) {
            logger.error("GW client 차단 실패 - clientId={}", clientId, e);
            result.put("success", false);
            result.put("msg", e.getMessage());
        }
        return toJson(result);
    }
}
