import apiClient from './apiClient.js'; import { formatCurrency, formatPercent } from './uiUtils.js'; class AIAdvisorView { constructor(section) { this.section = section; this.form = section?.querySelector('[data-ai-form]'); this.decisionContainer = section?.querySelector('[data-ai-result]'); this.sentimentContainer = section?.querySelector('[data-sentiment-result]'); this.disclaimer = section?.querySelector('[data-ai-disclaimer]'); this.contextInput = section?.querySelector('textarea[name="context"]'); this.modelSelect = section?.querySelector('select[name="model"]'); } init() { if (!this.form) return; this.form.addEventListener('submit', async (event) => { event.preventDefault(); const formData = new FormData(this.form); await this.handleSubmit(formData); }); } async handleSubmit(formData) { const symbol = formData.get('symbol') || 'BTC'; const horizon = formData.get('horizon') || 'swing'; const risk = formData.get('risk') || 'moderate'; const context = (formData.get('context') || '').trim(); const mode = formData.get('model') || 'auto'; if (this.decisionContainer) { this.decisionContainer.innerHTML = '
Generating AI strategy...
'; } if (this.sentimentContainer && context) { this.sentimentContainer.innerHTML = 'Running sentiment model...
'; } const decisionPayload = { query: `Provide ${horizon} outlook for ${symbol} with ${risk} risk. ${context}`, symbol, task: 'decision', options: { horizon, risk }, }; const jobs = [apiClient.runQuery(decisionPayload)]; if (context) { jobs.push(apiClient.analyzeSentiment({ text: context, mode })); } const [decisionResult, sentimentResult] = await Promise.all(jobs); if (!decisionResult.ok) { this.decisionContainer.innerHTML = ``; } else { this.renderDecisionResult(decisionResult.data || {}); } if (context && this.sentimentContainer) { if (!sentimentResult?.ok) { this.sentimentContainer.innerHTML = ``; } else { this.renderSentimentResult(sentimentResult.data || sentimentResult); } } } renderDecisionResult(response) { if (!this.decisionContainer) return; const payload = response.data || {}; const analysis = payload.analysis || payload; const summary = analysis.summary?.summary || analysis.summary || 'No summary provided.'; const signals = analysis.signals || {}; const topCoins = (payload.top_coins || []).slice(0, 3); this.decisionContainer.innerHTML = `${response.message || 'Decision support summary'}
${summary}
Label: ${payload.label || payload.classification || 'neutral'}
Score: ${payload.score ?? payload.sentiment?.score ?? '—'}
${payload.summary?.summary || payload.summary?.summary_text || payload.summary || ''}