import * as vscode from 'vscode';
import { migrateLayout } from '../../features/astraOffice';

/**
 * Pixel Office 사용자 정의 레이아웃 (cells/decos) 의 workspaceState 영구 저장 layer.
 *
 * 옛 코드: sidebarProvider 의 3개 private 메서드 (`_readPixelOfficeLayout`,
 * `_writePixelOfficeLayout`, `_clearPixelOfficeLayout`) + 1개 static key 상수.
 * 한 줄짜리 wrapper 들이지만 *workspaceState key + migration validator* 정책을
 * 한 클래스에 묶어 (a) key drift 방지, (b) 새 v2→v3 migration 추가 시 한 곳만,
 * (c) layout 형태를 모르는 webview 호출자도 안전한 unknown 반환.
 *
 * Read 는 legacy v1 데이터를 `migrateLayout` 으로 정규화 — 정상 통과 못 한 데이터는
 * null 로 fallback (webview 가 디폴트 LAYOUT 사용).
 */
export class PixelOfficeLayoutStore {
    private static readonly KEY = 'g1nation.pixelOfficeLayout';

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

    /** 저장된 layout 조회. raw → migrateLayout 통과 못 하면 null. */
    read(): unknown {
        const raw = this.context.workspaceState.get(PixelOfficeLayoutStore.KEY);
        if (raw == null) return null;
        return migrateLayout(raw);
    }

    /** webview 의 편집 모드에서 저장 버튼 누름 시 호출. */
    async write(layout: unknown): Promise<void> {
        await this.context.workspaceState.update(PixelOfficeLayoutStore.KEY, layout);
    }

    /** 디폴트 LAYOUT 으로 복귀 (entry 자체를 삭제). */
    async clear(): Promise<void> {
        await this.context.workspaceState.update(PixelOfficeLayoutStore.KEY, undefined);
    }
}
