package com.zioinfo.signage.rag;

import org.springframework.stereotype.Component;

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

/**
 * 에이전틱 tool-use 용 ESN 고유 도구 디스크립터 레지스트리.
 *
 * <p>중앙 {@code /rag/agent} 에 "AI 가 호출 가능한 도구 목록"으로 전달된다(이름·설명·파라미터
 * 스키마). 실제 실행은 중앙이 ESN 콜백/MCP 로 위임하거나, 본 디스크립터를 컨텍스트 힌트로만
 * 사용한다(서버 구현에 따름). 어느 쪽이든 ESN 은 <b>읽기 전용 조회 도구</b>만 노출하며,
 * 자격증명/PII/SSH 노출 도구는 등록하지 않는다.
 *
 * <p>알람 도메인(esn-ai-alarm-agent)이 다단계 진단 루프(증상→연관조회→가설→검증)를
 * 완주하도록 알람·HCore·의존성·작업이력 조회 도구를 제공한다.
 */
@Component
public class SignageToolRegistry {

    /** 알람 원인분석용 도구 셋(읽기전용). tenantCode 는 호출 시 컨텍스트로 고정. */
    public List<Map<String, Object>> alarmDiagnosisTools() {
        return List.of(
            tool("signage_get_alarm",
                "알람 ID로 단일 알람 상세(유형·심각도·메시지·발생시각·디바이스)를 조회한다.",
                param("alarmId", "string", "조회할 알람 ID")),
            tool("signage_list_related_alarms",
                "동일 매장/허브/시간창의 연관 알람 목록을 조회한다(연쇄 장애 식별용).",
                param("storeCode", "string", "매장 코드"),
                param("windowMinutes", "integer", "시간창(분), 기본 30")),
            tool("signage_get_hcore_status",
                "HCore 게이트웨이/허브의 현재 상태(온라인·하위 단말 수·마지막 통신)를 조회한다.",
                param("hcoreId", "string", "HCore 장치 ID")),
            tool("signage_get_dependency",
                "HCore↔매장↔ESL 단말↔태그바인딩 의존성 그래프를 조회한다(근본원인 수렴용).",
                param("rootType", "string", "시작 노드 유형: HCORE|STORE|DEVICE"),
                param("rootId", "string", "시작 노드 ID")),
            tool("signage_get_work_history",
                "디바이스/매장의 최근 작업 이력(펌웨어·교체·점검)을 조회한다(변경 연관 분석용).",
                param("targetType", "string", "대상 유형: STORE|DEVICE|HCORE"),
                param("targetId", "string", "대상 ID"))
        );
    }

    private Map<String, Object> tool(String name, String desc, Map<String, Object>... params) {
        Map<String, Object> properties = new LinkedHashMap<>();
        for (Map<String, Object> p : params) {
            String pn = (String) p.remove("__name");
            properties.put(pn, p);
        }
        Map<String, Object> schema = new LinkedHashMap<>();
        schema.put("type", "object");
        schema.put("properties", properties);

        Map<String, Object> t = new LinkedHashMap<>();
        t.put("name", name);
        t.put("description", desc);
        t.put("parameters", schema);
        return t;
    }

    private Map<String, Object> param(String name, String type, String desc) {
        Map<String, Object> p = new LinkedHashMap<>();
        p.put("__name", name);
        p.put("type", type);
        p.put("description", desc);
        return p;
    }
}
