import * as vscode from 'vscode';
import type { ChatMessage } from '../../agent';

/**
 * Chat 세션의 *side-state* globalState 3 keys 를 한 클래스로 통합:
 *
 *   - `g1nation.activeSessionId`       → 현재 활성 세션 id (또는 null)
 *   - `g1nation.blankChatActive`       → "새 채팅" 비어 있는 상태 플래그
 *   - `g1nation.lastVisibleChat`       → 마지막 가시 채팅의 snapshot (restore 용)
 *
 * 옛 코드: sidebarProvider 가 3개 static key 상수 + 흩어진 globalState.get/update
 * 호출로 직접 만지고 있었음. 한 곳으로 모아 (a) key drift 방지, (b) 타입 안전성
 * (boolean / string|null / snapshot 각각 typed accessor), (c) 새 metadata 추가 시
 * 한 파일만 수정.
 *
 * Note: `chat_sessions` 배열 자체는 `ChatSessionStore` 가 책임. 이 store 는
 * sessions 배열 자체가 아니라 *어느 게 활성이고, 마지막에 뭐가 보였고, 비어 있는
 * 상태인가* 같은 *연결 metadata* 만.
 */

export interface LastVisibleChatSnapshot {
    history: ChatMessage[];
    brainProfileId: string;
    sessionId: string | null;
    timestamp: number;
    negativePrompt?: string;
}

export class SessionStateStore {
    private static readonly ACTIVE_SESSION_KEY = 'g1nation.activeSessionId';
    private static readonly BLANK_CHAT_KEY = 'g1nation.blankChatActive';
    private static readonly LAST_VISIBLE_KEY = 'g1nation.lastVisibleChat';

    constructor(private readonly context: vscode.ExtensionContext) {}

    /** 현재 활성 세션 id. 없으면 null. */
    getActiveSessionId(): string | null {
        return this.context.globalState.get<string | null>(SessionStateStore.ACTIVE_SESSION_KEY, null);
    }

    /** 'none' 같은 sentinel 없이 null 명시. delete 시에도 null 로 설정. */
    async setActiveSessionId(id: string | null): Promise<void> {
        await this.context.globalState.update(SessionStateStore.ACTIVE_SESSION_KEY, id);
    }

    /** 사용자가 "새 채팅" 버튼 누르고 아직 한 줄도 입력 안 한 상태인지. */
    getBlankChatActive(): boolean {
        return this.context.globalState.get<boolean>(SessionStateStore.BLANK_CHAT_KEY, false);
    }

    async setBlankChatActive(active: boolean): Promise<void> {
        await this.context.globalState.update(SessionStateStore.BLANK_CHAT_KEY, active);
    }

    /** 마지막으로 가시했던 채팅 — sidebar reopen 시 즉시 복원에 사용. 없으면 null. */
    getLastVisibleChat(): LastVisibleChatSnapshot | null {
        return this.context.globalState.get<LastVisibleChatSnapshot | null>(SessionStateStore.LAST_VISIBLE_KEY, null);
    }

    async setLastVisibleChat(snapshot: LastVisibleChatSnapshot | null): Promise<void> {
        await this.context.globalState.update(SessionStateStore.LAST_VISIBLE_KEY, snapshot);
    }
}
