/* ── Text-to-SQL Export Variables ────────────────────────────────────────── */
let _t2sLastResult = null;  // Excel export용 — 마지막으로 렌더된 결과 보관

/* ── Text-to-SQL Dashboard ───────────────────────────────────── */
paneInit.t2s = t2sInitMode;

// MCP 모드 설정 (legacy | mcp)
let t2sMode = 'mcp';

/**
 * t2sInitMode - 현재 t2sMode에 맞게 UI 초기화 (탭 진입 시 호출)
 */
function t2sInitMode() {
  const parseBtn   = document.getElementById('t2s-parse-btn');
  const executeBtn = document.getElementById('t2s-execute-btn');
  const analyzeBtn = document.getElementById('t2s-analyze-btn');
  const logBox     = document.getElementById('t2s-log');
  if (t2sMode === 'mcp') {
    if (parseBtn)   parseBtn.classList.add('hidden');
    if (analyzeBtn) analyzeBtn.classList.add('hidden');
    if (logBox)     logBox.classList.add('hidden');
  } else {
    if (parseBtn)   parseBtn.classList.remove('hidden');
    if (executeBtn) executeBtn.classList.remove('hidden');
    if (analyzeBtn) analyzeBtn.classList.remove('hidden');
    if (logBox)     logBox.classList.remove('hidden');
  }
}

/**
 * toggleMcpMode - MCP 모드 토글
 */
function toggleMcpMode() {
  t2sMode = t2sMode === 'legacy' ? 'mcp' : 'legacy';
  
  // 버튼 표시/숨김 처리
  const parseBtn = document.getElementById('t2s-parse-btn');
  const executeBtn = document.getElementById('t2s-execute-btn');
  const analyzeBtn = document.getElementById('t2s-analyze-btn');
  const chatContainer = document.getElementById('t2s-chat-container');
  const logBox = document.getElementById('t2s-log');
  
  if (t2sMode === 'mcp') {
    // MCP 모드: 변환(Parse) · 분석 버튼 숨김, 실행 버튼은 유지
    if (parseBtn) parseBtn.classList.add('hidden');
    if (analyzeBtn) analyzeBtn.classList.add('hidden');
    if (logBox) logBox.classList.add('hidden');
    setGlobal('ok', 'MCP 모드');
  } else {
    // Legacy 모드: 모든 기능 표시
    if (parseBtn) parseBtn.classList.remove('hidden');
    if (executeBtn) executeBtn.classList.remove('hidden');
    if (analyzeBtn) analyzeBtn.classList.remove('hidden');
    if (logBox) logBox.classList.remove('hidden');
    setGlobal('ok', 'Legacy 모드');
  }
}

/**
 * t2sParse - 자연어 쿼리를 SQL로 변환
 * MCP 모드: LLM이 SQL 생성 + 즉시 실행
 * Legacy 모드: C# 파서로 SQL 생성
 */
async function t2sParse() {
  const input = document.getElementById('t2s-query').value.trim();
  if (!input) {
    alert('자연어 쿼리를 입력해주세요.');
    return;
  }

  const sqlTextarea = document.getElementById('t2s-sql');
  const resultContainer = document.getElementById('t2s-results');
  sqlTextarea.disabled = true;

  if (t2sMode === 'mcp') {
    sqlTextarea.value = 'LLM이 SQL 생성 중...';
    resultContainer.innerHTML = '<div class="t2s-loading">MCP 조회 중...</div>';
    try {
      const res = await api('POST', '/api/text-to-sql/query-nl', { query: input });
      console.log('[t2sParse] MCP 응답:', res);
      if (res.success) {
        const d = (typeof res.data === 'object' && res.data !== null) ? res.data : {};
        console.log('[t2sParse] 데이터 파싱:', d, 'type:', typeof d);
        console.log('[t2sParse] d.data:', d.data, 'd.columns:', d.columns, 'd.count:', d.count);
        
        // d.data가 object이지만 rows/columns 필드가 없을 수 있으므로 확인
        const dataObj = d.data || (Array.isArray(d) ? d : null);
        console.log('[t2sParse] dataObj:', dataObj);
        
        if (d.success === false) {
          sqlTextarea.value = `오류: ${d.error || 'SQL 생성 실패'}`;
          resultContainer.innerHTML = `<div class="t2s-error">MCP 오류: ${esc(d.error || 'SQL 생성 실패')}</div>`;
        } else {
          sqlTextarea.value = d.sql || '(SQL 없음)';
          // d.data가 object이지만 rows/columns 필드가 없을 수 있으므로 확인
          const rows = (dataObj && Array.isArray(dataObj.rows)) ? dataObj.rows : (Array.isArray(dataObj) ? dataObj : []);
          const columns = (dataObj && Array.isArray(dataObj.columns)) ? dataObj.columns : [];
          const totalCount = (dataObj && typeof dataObj.count === 'number') ? dataObj.count : (Array.isArray(dataObj) ? dataObj.length : 0);
          console.log('[t2sParse] 최종 rows.length:', rows.length, 'columns:', columns);
          
          if (rows.length === 0) {
            resultContainer.innerHTML = '<div class="t2s-empty">조회 결과가 없습니다. (SQL은 생성됨)</div>';
          } else {
            t2sRenderTable({ rows, columns, totalCount });
          }
        }
      } else {
        sqlTextarea.value = `오류: ${res.error || '알 수 없는 오류'}`;
        resultContainer.innerHTML = '';
      }
    } catch (err) {
      sqlTextarea.value = `연결 오류: ${err.message}`;
      resultContainer.innerHTML = '';
    }
  } else {
    sqlTextarea.value = '변환 중...';
    try {
      const res = await api('POST', '/api/text-to-sql/parse', { query: input });
      if (res.success) {
        sqlTextarea.value = res.sql || 'SQL 생성 실패';
      } else {
        sqlTextarea.value = `오류: ${res.error || '알 수 없는 오류'}`;
      }
    } catch (err) {
      sqlTextarea.value = `연결 오류: ${err.message}`;
    }
  }

  sqlTextarea.disabled = false;
}

/**
 * t2sPivot - tagname 컬럼이 있으면 wide format으로 변환 (query_with_nl 서버 로직과 동일)
 */
function t2sPivot(columns, rows) {
  console.log('[t2sPivot] 입력: columns:', columns, 'rows.length:', rows.length);
  if (!columns.includes('tagname') || !rows.length) return { columns, rows };
  const timeCol = columns.find(c => !['tagname', 'value', 'livevalue', 'avg_val'].includes(c));
  const valCol = ['value', 'avg_val'].find(c => columns.includes(c)) || columns[columns.length - 1];
  if (!timeCol) return { columns, rows };
  const tagNames = [...new Set(rows.map(r => r['tagname']))].sort();
  const pivoted = {};
  for (const row of rows) {
    const key = String(row[timeCol]);
    if (!pivoted[key]) pivoted[key] = { [timeCol]: row[timeCol] };
    pivoted[key][row['tagname']] = row[valCol];
  }
  const result = { columns: [timeCol, ...tagNames], rows: Object.values(pivoted) };
  console.log('[t2sPivot] 결과: columns:', result.columns, 'rows.length:', result.rows.length);
  return result;
}

/**
 * t2sExecute - SQL 실행
 * MCP 모드에서는 /api/text-to-sql/execute-mcp 엔드포인트를 사용하며 pivot 적용
 */
async function t2sExecute() {
  const sql = document.getElementById('t2s-sql').value.trim();
  if (!sql) {
    alert('SQL을 입력해주세요.');
    return;
  }

  const limitInput = document.getElementById('t2s-limit');
  const limit = limitInput.value ? parseInt(limitInput.value) : 1000;

  const resultContainer = document.getElementById('t2s-results');
  resultContainer.innerHTML = '<div class="t2s-loading">실행 중...</div>';

  try {
    if (t2sMode === 'mcp') {
      const res = await api('POST', '/api/text-to-sql/execute-mcp', { sql, limit });
      console.log('[t2sExecute] MCP execute 응답:', res);
      if (res.success) {
        const d = res.data || {};
        console.log('[t2sExecute] d.data:', d.data, 'd.columns:', d.columns);
        const { columns, rows } = t2sPivot(d.columns || [], d.data || []);
        console.log('[t2sExecute] pivot 후 rows.length:', rows.length);
        t2sRenderTable({ rows, columns, totalCount: rows.length });
      } else {
        resultContainer.innerHTML = `<div class="t2s-error">오류: ${res.error || '알 수 없는 오류'}</div>`;
      }
    } else {
      const res = await api('POST', '/api/text-to-sql/execute-mcp', { sql, limit });
      if (res.success) {
        const d = res.data || {};
        const { columns, rows } = t2sPivot(d.columns || [], d.data || []);
        t2sRenderTable({ rows, columns, totalCount: rows.length });
      } else {
        resultContainer.innerHTML = `<div class="t2s-error">오류: ${res.error || '알 수 없는 오류'}</div>`;
      }
    }
  } catch (err) {
    resultContainer.innerHTML = `<div class="t2s-error">연결 오류: ${err.message}</div>`;
  }
}

/**
 * t2sRenderTable - 쿼리 결과를 테이블로 렌더링
 */
function t2sRenderTable(result) {
  const container = document.getElementById('t2s-results');
  
  console.log('[t2sRenderTable] 입력 결과:', result);
  
  // 백엔드 응답: columns, rows, totalCount (소문자)
  const rows = result.rows || [];
  const columns = result.columns || [];
  const totalCount = result.totalCount || 0;
  
  console.log('[t2sRenderTable] rows.length:', rows.length, 'columns:', columns);
  
  // ── 추가: 결과 저장 (export용) ──
  _t2sLastResult = rows.length > 0 ? { columns, rows } : null;
  
  if (!rows || rows.length === 0) {
    console.log('[t2sRenderTable] 빈 결과 - 결과 없음 표시');
    container.innerHTML = '<div class="t2s-empty">결과가 없습니다.</div>';
    return;
  }

  // 컬럼이 비어있으면 첫 행에서 추출
  const colNames = columns.length > 0 ? columns : Object.keys(rows[0]);
  
  let html = '<div class="t2s-result-info">총 <b>' + totalCount + '</b>개 결과<button class="btn-excel" onclick="t2sExportExcel()">⬇ Excel</button></div>';
  html += '<table class="t2s-table">';
  
  // Header
  html += '<thead><tr>';
  colNames.forEach(col => {
    html += `<th>${esc(col)}</th>`;
  });
  html += '</tr></thead>';
  
  // Body
  html += '<tbody>';
  rows.forEach(row => {
    html += '<tr>';
    colNames.forEach(col => {
      const val = row[col];
      const isTimeCol = /recorded_at|timestamp|bucket|time/i.test(col);
      const display = val !== null && val !== undefined
        ? esc(String(isTimeCol ? fmtTs(val) : fmtVal(val)))
        : '<span class="t2s-null">NULL</span>';
      html += `<td>${display}</td>`;

    });
    html += '</tr>';
  });
  html += '</tbody>';
  
  html += '</table>';
  container.innerHTML = html;
}

/**
 * t2sExportExcel — 마지막 쿼리 결과를 .xlsx로 다운로드
 */
function t2sExportExcel() {
  if (!_t2sLastResult) return;
  
  if (typeof XLSX === 'undefined') {
    alert('Excel 라이브러리 로드 실패');
    return;
  }

  const { columns, rows } = _t2sLastResult;

  // 1. 헤더 행 + 데이터 행 배열 구성
  const sheetData = [
    columns,  // 첫 행 = 컬럼 헤더
    ...rows.map(row => columns.map(col => {
      const v = row[col];
      if (v == null) return '';
      const isTimeCol = /recorded_at|timestamp|bucket|time/i.test(col);
      if (isTimeCol) return fmtTs(v);
      const n = Number(v);
      return Number.isFinite(n) ? n : String(v);
    }))
  ];

  // 2. 워크시트 생성
  const ws = XLSX.utils.aoa_to_sheet(sheetData);

  // 3. 컬럼 너비 자동 조정 (최대 30자)
  ws['!cols'] = columns.map((col, i) => {
    const maxLen = Math.max(
      col.length,
      ...rows.map(r => String(r[col] ?? '').length)
    );
    return { wch: Math.min(maxLen + 2, 30) };
  });

  // 4. 워크북 생성 및 다운로드
  const wb = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(wb, ws, 'QueryResult');

  const now = new Date();
  const ts  = now.toISOString().replace(/[:.]/g, '-').substring(0, 19);
  XLSX.writeFile(wb, `query_result_${ts}.xlsx`);
}

/**
 * t2sAnalyze - 태그 분석 (시계열 분석) (Legacy 모드용)
 */
async function t2sAnalyze() {
  const tagNames = document.getElementById('t2s-tags').value.trim();
  if (!tagNames) {
    alert('분석할 태그 이름을 입력해주세요.');
    return;
  }

  const interval = document.getElementById('t2s-interval').value;
  const limit = document.getElementById('t2s-limit-analyze').value || '100';
  
  const dateFrom = document.getElementById('t2s-date-from').value;
  const dateTo = document.getElementById('t2s-date-to').value;
  
  const resultContainer = document.getElementById('t2s-analysis-results');
  resultContainer.innerHTML = '<div class="t2s-loading">분석 중...</div>';

  try {
    const res = await api('POST', '/api/text-to-sql/analyze', {
      tagNames: tagNames.split(',').map(t => t.trim()).filter(t => t),
      interval: interval,
      from: dateFrom || undefined,
      to: dateTo || undefined
    });
    
    if (res.success) {
      t2sRenderAnalysis(res);
    } else {
      resultContainer.innerHTML = `<div class="t2s-error">오류: ${res.error || '알 수 없는 오류'}</div>`;
    }
  } catch (err) {
    resultContainer.innerHTML = `<div class="t2s-error">연결 오류: ${err.message}</div>`;
  }
}

/**
 * t2sRenderAnalysis - 분석 결과를 렌더링
 */
function t2sRenderAnalysis(result) {
  const container = document.getElementById('t2s-analysis-results');
  
  if (!result.tags || result.tags.length === 0) {
    container.innerHTML = '<div class="t2s-empty">분석 결과가 없습니다.</div>';
    return;
  }

  let html = '<div class="t2s-result-info">총 <b>' + result.tags.length + '</b>개 태그 분석</div>';
  html += '<div class="t2s-analysis-grid">';
  
  result.tags.forEach(tag => {
    html += '<div class="t2s-tag-card">';
    html += `<h4>${esc(tag.tagName.toUpperCase())}</h4>`;
    html += '<div class="t2s-tag-stats">';
    html += `<div class="t2s-stat-row"><span>평균:</span><span class="t2s-value">${tag.mean?.toFixed(2) || 'N/A'}</span></div>`;
    html += `<div class="t2s-stat-row"><span>최대:</span><span class="t2s-value t2s-max">${tag.max?.toFixed(2) || 'N/A'}</span></div>`;
    html += `<div class="t2s-stat-row"><span>최소:</span><span class="t2s-value t2s-min">${tag.min?.toFixed(2) || 'N/A'}</span></div>`;
    html += `<div class="t2s-stat-row"><span>표준편차:</span><span class="t2s-value">${tag.stdDev?.toFixed(2) || 'N/A'}</span></div>`;
    html += '</div>';
    html += '</div>';
  });
  
  html += '</div>';
  container.innerHTML = html;
}

/**
 * t2sSetQuery - 제안 쿼리 설정
 */
function t2sSetQuery(query) {
  document.getElementById('t2s-query').value = query;
}

/* ── 채팅 기능 ────────────────────────────────────────────────── */

/**
 * t2sChatSend - 채팅 메시지 전송
 */
async function t2sChatSend() {
  const input = document.getElementById('t2s-chat-input');
  const message = input.value.trim();
  if (!message) return;

  // 입력 필드 비활성화
  input.disabled = true;
  document.getElementById('t2s-chat-send-btn').disabled = true;

  // 사용자 메시지 추가
  t2sAddChatMessage('user', message);
  input.value = '';

  try {
    if (t2sMode === 'mcp') {
      // MCP 모드: 자연어 → LLM SQL 생성 → 실행
      t2sAddChatMessage('system', '<span class="t2s-typing">LLM이 SQL 생성 중...</span>');

      const executeRes = await api('POST', '/api/text-to-sql/query-nl', { query: message });

      // 로딩 메시지 제거
      const loadMsgs = document.querySelectorAll('[id^="t2s-chat-loading-"]');
      loadMsgs.forEach(el => el.remove());

      if (!executeRes.success) {
        t2sAddChatMessage('system', `<span class="t2s-error">실패: ${executeRes.error || '알 수 없는 오류'}</span>`);
      } else {
        const d = executeRes.data || {};
        if (d.sql) {
          document.getElementById('t2s-sql').value = d.sql;
          t2sAddChatMessage('system', `✅ SQL 생성:<br><pre class="t2s-chat-sql">${esc(d.sql)}</pre>`);
        }
        if (d.success === false) {
          t2sAddChatMessage('system', `<span class="t2s-error">실행 오류: ${d.error || '알 수 없는 오류'}</span>`);
        } else {
          t2sRenderTable({ rows: d.data || [], columns: d.columns || [], totalCount: d.count || 0 });
          t2sAddChatMessage('system', `✅ <b>${d.count || 0}</b>개 결과 조회 완료`);
        }
      }
    } else {
      // Legacy 모드: 2-hop 구조 (Parse → Execute)
      const loadingId = 't2s-chat-loading-' + Date.now();
      t2sAddChatMessage('system', '<span class="t2s-typing">변환 중...</span>', loadingId);

      const parseRes = await api('POST', '/api/text-to-sql/parse', { query: message });
      
      // 로딩 메시지 제거
      const loadingEl = document.getElementById(loadingId);
      if (loadingEl) loadingEl.remove();

      if (!parseRes.success || !parseRes.sql) {
        t2sAddChatMessage('system', `<span class="t2s-error">SQL 변환 실패: ${parseRes.error || '알 수 없는 오류'}</span>`);
        input.disabled = false;
        document.getElementById('t2s-chat-send-btn').disabled = false;
        input.focus();
        return;
      }

      // SQL 텍스트박스에도 반영
      document.getElementById('t2s-sql').value = parseRes.sql;

      // 시스템 메시지: 변환된 SQL 표시
      t2sAddChatMessage('system', `✅ SQL 변환 완료:<br><pre class="t2s-chat-sql">${esc(parseRes.sql)}</pre>`);

      // 2. SQL 자동 실행
      t2sAddChatMessage('system', '<span class="t2s-typing">쿼리 실행 중...</span>');
      
      const limitInput = document.getElementById('t2s-limit');
      const limit = limitInput.value ? parseInt(limitInput.value) : 1000;
      const executeRes = await api('POST', '/api/text-to-sql/execute-mcp', { sql: parseRes.sql, limit });

      // 로딩 메시지 제거
      const loadMsgs = document.querySelectorAll('[id^="t2s-chat-loading-"]');
      loadMsgs.forEach(el => el.remove());

      if (!executeRes.success) {
        t2sAddChatMessage('system', `<span class="t2s-error">쿼리 실행 실패: ${executeRes.error || '알 수 없는 오류'}</span>`);
      } else {
        // 결과 테이블 업데이트
        const d = executeRes.data || {};
        const { columns, rows } = t2sPivot(d.columns || [], d.data || []);
        t2sRenderTable({ rows, columns, totalCount: rows.length });
        
        // 결과 수 표시
        const totalCount = executeRes.totalCount || 0;
        t2sAddChatMessage('system', `✅ <b>${totalCount}</b>개 결과 조회 완료`);
      }
    }
  } catch (err) {
    // 로딩 메시지 제거
    const loadMsgs = document.querySelectorAll('[id^="t2s-chat-loading-"]');
    loadMsgs.forEach(el => el.remove());

    t2sAddChatMessage('system', `<span class="t2s-error">연결 오류: ${err.message}</span>`);
  } finally {
    // 입력 필드 활성화
    input.disabled = false;
    document.getElementById('t2s-chat-send-btn').disabled = false;
    input.focus();
  }
}

/**
 * t2sAddChatMessage - 채팅 메시지 추가
 */
function t2sAddChatMessage(type, content, id) {
  const container = document.getElementById('t2s-chat-messages');
  const msgId = id || 't2s-msg-' + Date.now();
  
  const div = document.createElement('div');
  div.className = `t2s-chat-msg ${type}`;
  div.id = msgId;
  
  const bubble = document.createElement('div');
  bubble.className = 't2s-chat-bubble';
  bubble.innerHTML = content;
  
  div.appendChild(bubble);
  container.appendChild(div);
  
  // 스크롤 맨 아래로
  const chatContainer = document.querySelector('.t2s-chat-container');
  chatContainer.scrollTop = chatContainer.scrollHeight;
  
  return msgId;
}

/* ─── Text-to-SQL MCP 도구 관련 함수 ───────────────────────── */

/**
 * loadMcpTools - MCP 도구 목록 로드
 */
async function loadMcpTools() {
  try {
    const res = await api('GET', '/api/text-to-sql/tools');
    if (res.success && res.tools && res.tools.length > 0) {
      renderToolsChips(res.tools);
      return res.tools;
    }
  } catch (e) {
    console.error('MCP 도구 로드 실패:', e);
  }
  return [];
}

/**
 * renderToolsChips - 도구 목록을 추천 쿼리 칩 형태로 렌더링
 */
function renderToolsChips(tools) {
  const container = document.getElementById('t2s-tools-container');
  if (!container) return;
  
  const chipColors = ['bg-a', 'bg-b', 'bg-c', 'bg-d'];
  container.innerHTML = tools.map((tool, idx) => {
    const colorClass = chipColors[idx % chipColors.length];
    return `<button class="t2s-chip chip-${colorClass}" onclick="callTool('${tool.name}')">
      ${esc(tool.description || tool.name)}
    </button>`;
  }).join('');
}

/**
 * callTool - MCP 도구 직접 호출 (MCP 모드)
 */
async function callTool(toolName) {
  const input = document.getElementById('t2s-query').value.trim();
  if (!input) {
    alert(toolName === 'query_pv_history' ? '태그 이름을 입력해주세요.' : '쿼리를 입력해주세요.');
    return;
  }
  
  const resultContainer = document.getElementById('t2s-results');
  resultContainer.innerHTML = '<div class="t2s-loading">도구 호출 중...</div>';
  
  try {
    const res = await api('POST', '/api/text-to-sql/execute-mcp', { sql: input });
    if (res.success) {
      t2sRenderTable(res);
    } else {
      resultContainer.innerHTML = `<div class="t2s-error">오류: ${res.error || '알 수 없는 오류'}</div>`;
    }
  } catch (err) {
    resultContainer.innerHTML = `<div class="t2s-error">연결 오류: ${err.message}</div>`;
  }
}

/* ── API 대화 기능 (새 페이지) ────────────────────────────────── */

/**
 * apiChatSend - API 대화 메시지 전송
 */
async function apiChatSend() {
  const input = document.getElementById('api-chat-input');
  const message = input.value.trim();
  if (!message) return;

  // 입력 필드 비활성화
  input.disabled = true;
  document.getElementById('api-chat-send-btn').disabled = true;

  // 사용자 메시지 추가
  apiAddChatMessage('user', message);
  input.value = '';

  // 로딩 메시지 추가
  const loadingId = 'api-chat-loading-' + Date.now();
  apiAddChatMessage('system', '<span class="t2s-typing">처리 중...</span>', loadingId);

  try {
    // 1. 자연어 쿼리를 SQL로 변환
    const parseRes = await api('POST', '/api/text-to-sql/parse', { query: message });
    
    // 로딩 메시지 제거
    const loadingEl = document.getElementById(loadingId);
    if (loadingEl) loadingEl.remove();

    if (!parseRes.success || !parseRes.sql) {
      apiAddChatMessage('system', `<span class="t2s-error">SQL 변환 실패: ${parseRes.error || '알 수 없는 오류'}</span>`);
      input.disabled = false;
      document.getElementById('api-chat-send-btn').disabled = false;
      input.focus();
      return;
    }

    // SQL 표시
    apiAddChatMessage('assistant', `📝 변환된 SQL:<br><pre class="api-chat-sql">${esc(parseRes.sql)}</pre>`);

    // 2. SQL 자동 실행
    apiAddChatMessage('assistant', '<span class="t2s-typing">쿼리 실행 중...</span>');
    
    const executeRes = await api('POST', '/api/text-to-sql/execute-mcp', { sql: parseRes.sql, limit: 1000 });

    // 로딩 메시지 제거
    const loadMsgs = document.querySelectorAll('[id^="api-chat-loading-"]');
    loadMsgs.forEach(el => el.remove());

    if (!executeRes.success) {
      apiAddChatMessage('system', `<span class="t2s-error">쿼리 실행 실패: ${executeRes.error || '알 수 없는 오류'}</span>`);
    } else {
      // 결과를 응답 창에 표시
      const d = executeRes.data || {};
      apiRenderResponse({ rows: d.data || [], totalCount: d.count || 0 });
      
      // 결과 수 표시
      const totalCount = executeRes.totalCount || 0;
      apiAddChatMessage('assistant', `✅ <b>${totalCount}</b>개 결과 조회 완료`);
    }
  } catch (err) {
    // 로딩 메시지 제거
    const loadMsgs = document.querySelectorAll('[id^="api-chat-loading-"]');
    loadMsgs.forEach(el => el.remove());

    apiAddChatMessage('system', `<span class="t2s-error">연결 오류: ${err.message}</span>`);
  } finally {
    // 입력 필드 활성화
    input.disabled = false;
    document.getElementById('api-chat-send-btn').disabled = false;
    input.focus();
  }
}

/**
 * apiAddChatMessage - API 채팅 메시지 추가
 */
function apiAddChatMessage(type, content, id) {
  const container = document.getElementById('api-chat-messages');
  const msgId = id || 'api-msg-' + Date.now();
  
  const div = document.createElement('div');
  div.className = `api-chat-msg ${type}`;
  div.id = msgId;
  
  const bubble = document.createElement('div');
  bubble.className = 'api-chat-bubble';
  bubble.innerHTML = content;
  
  div.appendChild(bubble);
  container.appendChild(div);
  
  // 스크롤 맨 아래로
  const chatContainer = document.querySelector('.api-chat-messages');
  chatContainer.scrollTop = chatContainer.scrollHeight;
  
  return msgId;
}

/**
 * t2sChatClear - 채팅 초기화
 */
function t2sChatClear() {
  const container = document.getElementById('t2s-chat-messages');
  container.innerHTML = `
    <div class="t2s-chat-msg system">
      <div class="t2s-chat-bubble">
        <strong>시스템:</strong><br/>
        자연어 질의를 입력하면 SQL로 변환하고 결과를 조회합니다.<br/>
        예: "FICQ-6101.PV 최근 1시간 평균", "최대값 조회", "추세 분석"
      </div>
    </div>
  `;
}

/* ─── Text-to-SQL MCP 도구 관련 함수 ───────────────────────── */

/**
 * apiChatClear - API 채팅 초기화
 */
function apiChatClear() {
  const container = document.getElementById('api-chat-messages');
  container.innerHTML = `
    <div class="api-chat-msg system">
      <div class="api-chat-bubble">
        <strong>시스템:</strong><br/>
        API와 대화할 수 있습니다. 자연어로 질의를 입력하면 SQL로 변환하고 결과를 조회합니다.<br/>
        예: "FICQ-6101.PV 최근 1시간 평균", "최대값 조회", "추세 분석"
      </div>
    </div>
  `;
  
  // 응답 창도 초기화
  document.getElementById('api-response-content').innerHTML = '<span class="placeholder">응답이 여기에 표시됩니다</span>';
}

/**
 * apiRenderResponse - API 응답을 응답 창에 표시
 */
function apiRenderResponse(data) {
  const container = document.getElementById('api-response-content');
  
  if (!data.rows || data.rows.length === 0) {
    container.innerHTML = '<span class="placeholder">조회된 결과가 없습니다</span>';
    return;
  }

  // 테이블 생성
  let html = '<table class="api-response-table"><thead><tr>';
  
  // 헤더 생성
  const columns = Object.keys(data.rows[0]);
  columns.forEach(col => {
    html += `<th>${esc(col)}</th>`;
  });
  html += '</tr></thead><tbody>';
  
  // 데이터 행 생성
  data.rows.forEach(row => {
    html += '<tr>';
    columns.forEach(col => {
      const value = row[col];
      html += `<td>${value !== null && value !== undefined ? esc(String(value)) : ''}</td>`;
    });
    html += '</tr>';
  });
  
  html += '</tbody></table>';
  html += `<p style="margin-top:8px;font-size:12px;color:var(--t2)">총 ${data.totalCount || 0}개 결과</p>`;
  
  container.innerHTML = html;
}
