/**
 * @file splitViewStorage.ts
 * @description Persists the Workspace page's split-terminal layout (1/2/4
 * panes) and each pane's chosen lane id to localStorage, so the layout
 * survives a page reload. Follows the same read/write-with-fallback
 * convention as useTheme.ts.
 * @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
 */

export type SplitLayout = 1 | 2 | 4;

export interface SplitViewState {
  layout: SplitLayout;
  paneLaneIds: (number | null)[];
}

const STORAGE_KEY = "ccam.workspace.splitView";

export function defaultSplitViewState(): SplitViewState {
  return { layout: 1, paneLaneIds: [null] };
}

function isValidLayout(value: unknown): value is SplitLayout {
  return value === 1 || value === 2 || value === 4;
}

function isValidState(value: unknown): value is SplitViewState {
  if (!value || typeof value !== "object") return false;
  const v = value as Record<string, unknown>;
  return (
    isValidLayout(v.layout) &&
    Array.isArray(v.paneLaneIds) &&
    v.paneLaneIds.every((id) => id === null || typeof id === "number")
  );
}

export function readSplitViewState(): SplitViewState {
  try {
    const raw = localStorage.getItem(STORAGE_KEY);
    if (!raw) return defaultSplitViewState();
    const parsed: unknown = JSON.parse(raw);
    return isValidState(parsed) ? parsed : defaultSplitViewState();
  } catch {
    return defaultSplitViewState();
  }
}

export function writeSplitViewState(state: SplitViewState): void {
  try {
    localStorage.setItem(STORAGE_KEY, JSON.stringify(state));
  } catch {
    /* ignore quota / disabled storage */
  }
}
