import type { ChatMessage } from '../../agent';
import type { ChatSession } from '../managers/chatSessionStore';

/**
 * Chat session 관련 webview payload + 작은 pure helpers. send 호출은 provider 가
 * 담당 — 이 모듈은 데이터 변환만.
 *
 *   - buildSessionListPayload(sessions) — 'sessionList' (sidebar list)
 *   - buildSessionLoadedPayload(...) — 'sessionLoaded' (특정 세션 활성화 알림)
 *   - buildSessionTitleFromHistory(history) — 첫 user 메시지 → 50자 trim title
 */

/**
 * 임의 text 를 session title 로 50자 cap. 빈 / 비공백이면 `fallback`.
 * newline 은 공백으로 normalize. 50자 초과면 `...` suffix.
 */
export function buildSessionTitleFromText(text: string | undefined | null, fallback: string): string {
    if (typeof text !== 'string' || !text.trim()) return fallback;
    const normalized = text.substring(0, 50).replace(/\n/g, ' ');
    return normalized + (text.length > 50 ? '...' : '');
}

/**
 * 첫 user 메시지 (없으면 'New Chat') 로부터 50자 cap title 생성. 너무 길면
 * `...` suffix. newline 은 공백으로 normalize. `buildSessionTitleFromText` 의 thin wrapper.
 */
export function buildSessionTitleFromHistory(history: ChatMessage[]): string {
    const firstMsg = history.find((m) => m.role === 'user')?.content;
    return buildSessionTitleFromText(typeof firstMsg === 'string' ? firstMsg : '', 'New Chat');
}

/** Sidebar 의 sessions list — 각 entry 의 messageCount + history 함께 송신. */
export function buildSessionListPayload(sessions: ChatSession[]) {
    return {
        type: 'sessionList' as const,
        value: sessions.map((s) => ({
            id: s.id,
            title: s.title,
            timestamp: s.timestamp,
            brainProfileId: s.brainProfileId || '',
            messageCount: s.history.length,
            history: s.history,
        })),
    };
}

/** 특정 세션을 로드 완료했을 때 webview 에 전달 — UI 가 즉시 갱신. */
export function buildSessionLoadedPayload(
    id: string,
    title: string,
    history: ChatMessage[],
    negativePrompt: string,
) {
    return {
        type: 'sessionLoaded' as const,
        value: {
            id,
            title: title || 'Chat Session',
            history,
            negativePrompt,
        },
    };
}
