export interface TripWorkspaceState {
  day?: number;
  step?: string;
  panel?: string;
}

const keyFor = (tripId: string) => `triptale:workspace:${tripId}`;

export function readTripWorkspaceState(storage: Storage, tripId: string): TripWorkspaceState {
  try {
    const raw = storage.getItem(keyFor(tripId));
    return raw ? JSON.parse(raw) as TripWorkspaceState : {};
  } catch {
    storage.removeItem(keyFor(tripId));
    return {};
  }
}

export function rememberTripWorkspaceState(storage: Storage, tripId: string, search: URLSearchParams) {
  const day = Number(search.get("day"));
  const next: TripWorkspaceState = {
    day: Number.isInteger(day) && day > 0 ? day : undefined,
    step: search.get("step") || undefined,
    panel: search.get("panel") || undefined,
  };
  storage.setItem(keyFor(tripId), JSON.stringify(next));
  return next;
}

export function mergeWorkspaceSearch(current: URLSearchParams, remembered: TripWorkspaceState) {
  const next = new URLSearchParams(current);
  if (!next.has("day") && remembered.day) next.set("day", String(remembered.day));
  if (!next.has("step") && remembered.step) next.set("step", remembered.step);
  if (!next.has("panel") && remembered.panel) next.set("panel", remembered.panel);
  return next;
}

export function workspaceHref(pathname: string, search: URLSearchParams) {
  const value = search.toString();
  return `${pathname}${value ? `?${value}` : ""}`;
}
