export type OnlineClassApiErrorEntry = {
  id: string;
  at: string;
  method: string;
  path: string;
  status: number;
  message: string;
  payload: unknown;
};

const KEY = "online_class_api_errors";
const MAX = 40;
const SENSITIVE = ["password", "api_token", "token", "access_token", "refresh_token", "secret", "authorization"];

export function recordOnlineClassApiError(entry: Omit<OnlineClassApiErrorEntry, "id" | "at">) {
  if (typeof window === "undefined") return;
  if (!entry.path.startsWith("/online-class")) return;
  if (entry.path.startsWith("/online-class/provider-calls")) return;

  const next: OnlineClassApiErrorEntry = {
    ...entry,
    id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
    at: new Date().toISOString(),
    payload: redactValue(entry.payload),
  };
  const list = readOnlineClassApiErrors();
  list.unshift(next);
  sessionStorage.setItem(KEY, JSON.stringify(list.slice(0, MAX)));
  window.dispatchEvent(new Event("online-class-api-error"));
}

export function readOnlineClassApiErrors(): OnlineClassApiErrorEntry[] {
  if (typeof window === "undefined") return [];
  try {
    const raw = sessionStorage.getItem(KEY);
    if (!raw) return [];
    const parsed = JSON.parse(raw) as OnlineClassApiErrorEntry[];
    return Array.isArray(parsed) ? parsed : [];
  } catch {
    return [];
  }
}

export function clearOnlineClassApiErrors() {
  if (typeof window === "undefined") return;
  sessionStorage.removeItem(KEY);
  window.dispatchEvent(new Event("online-class-api-error"));
}

function redactValue(value: unknown): unknown {
  if (Array.isArray(value)) return value.map((item) => redactValue(item));
  if (!value || typeof value !== "object") return value;

  const out: Record<string, unknown> = {};
  for (const [key, item] of Object.entries(value as Record<string, unknown>)) {
    out[key] = SENSITIVE.includes(key.toLowerCase()) ? "***" : redactValue(item);
  }
  return out;
}
