export type PhotoModerationAction = {
  id: string;
  eventSlug: string;
  photoId: number;
  action: 'approve' | 'hide' | 'show' | 'feature' | 'unfeature';
  createdAt: string;
};

const STORAGE_KEY = 'fotospiel-admin-photo-queue';

function buildId(): string {
  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
    return crypto.randomUUID();
  }

  return `${Date.now()}-${Math.random().toString(16).slice(2, 10)}`;
}

export function loadPhotoQueue(): PhotoModerationAction[] {
  if (typeof window === 'undefined') {
    return [];
  }

  try {
    const raw = window.localStorage.getItem(STORAGE_KEY);
    if (!raw) {
      return [];
    }
    const parsed = JSON.parse(raw);
    return Array.isArray(parsed) ? (parsed as PhotoModerationAction[]) : [];
  } catch {
    return [];
  }
}

export function savePhotoQueue(queue: PhotoModerationAction[]): void {
  if (typeof window === 'undefined') {
    return;
  }

  try {
    window.localStorage.setItem(STORAGE_KEY, JSON.stringify(queue));
  } catch {
    // Ignore persistence failures.
  }
}

export function enqueuePhotoAction(action: Omit<PhotoModerationAction, 'id' | 'createdAt'>): PhotoModerationAction[] {
  const queue = loadPhotoQueue();
  const entry: PhotoModerationAction = {
    ...action,
    id: buildId(),
    createdAt: new Date().toISOString(),
  };
  const next = [...queue, entry];
  savePhotoQueue(next);
  return next;
}

export function removePhotoAction(queue: PhotoModerationAction[], id: string): PhotoModerationAction[] {
  const next = queue.filter((item) => item.id !== id);
  savePhotoQueue(next);
  return next;
}

export function replacePhotoQueue(queue: PhotoModerationAction[]): PhotoModerationAction[] {
  savePhotoQueue(queue);
  return queue;
}
