import * as vscode from 'vscode';
import type { ProjectProfile } from '../../features/projectChronicle';
import { workspaceAutoDetectedProfile } from '../builders/projectProfileFactories';

/**
 * Project Chronicle 의 *프로젝트 목록* globalState read/write layer.
 *
 * 옛 코드: sidebarProvider 의 `_getChronicleProjects` (40줄, validation + workspace
 * 자동 등록 fallback) + `_putChronicleProjects` (한 줄) + 두 static state key.
 * Store 로 격리해 (a) `chronicleProjects` key drift 방지, (b) workspace fallback
 * 정책 한 곳, (c) validation 규칙 단일화.
 *
 * 의도된 한계: `activeChronicleProjectStateKey` (현재 활성 project id) 는 여전히
 * provider 가 관리 — UI flow / 활성 전환 흐름과 강하게 엮여 있어 함께 옮기면
 * deps 폭증.
 *
 * `getAll()` 의 fallback: 저장된 valid project 가 0 개면 *현재 workspace 의 first
 * folder 를 즉석 등록* (사용자가 별도 설정 없이도 chronicle 기능 사용 가능). 이건
 * read 가 가질 수 있는 신선한 default → 호출자는 호출마다 같은 모양을 보장받음.
 */
export class ChronicleProjectStore {
    private static readonly PROJECTS_KEY = 'g1nation.chronicleProjects';

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

    /**
     * 저장된 chronicle project 목록. validation 통과한 entry 가 0 개면 현재
     * workspace folder 로 즉석 default 1개를 생성해 반환 (저장은 하지 않음 —
     * 호출자가 setActive 등을 할 때 별도로 putAll 됨).
     */
    getAll(): ProjectProfile[] {
        const raw = this.context.globalState.get<ProjectProfile[]>(ChronicleProjectStore.PROJECTS_KEY, []) || [];
        const valid = raw.filter((profile: ProjectProfile) =>
            profile
            && typeof profile.projectId === 'string'
            && typeof profile.projectName === 'string'
            && typeof profile.recordRoot === 'string',
        );

        if (valid.length > 0) return valid;

        const workspaceRoot = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath;
        if (!workspaceRoot) return [];
        return [workspaceAutoDetectedProfile(workspaceRoot)];
    }

    async putAll(projects: ProjectProfile[]): Promise<void> {
        await this.context.globalState.update(ChronicleProjectStore.PROJECTS_KEY, projects);
    }
}
