export type DigilanderModuleStatus = 'ready' | 'empty' | 'locked' | 'failed';

export interface DigilanderModuleResponse<T> {
  status: DigilanderModuleStatus;
  reason: string | null;
  count: number;
  data: T | null;
}

export function digilanderModuleOk<T>(data: T, count?: number): DigilanderModuleResponse<T> {
  return {
    status: 'ready',
    reason: null,
    count: count ?? (
      Array.isArray((data as any)?.entries) ? (data as any).entries.length :
      Array.isArray((data as any)?.items) ? (data as any).items.length :
      Array.isArray((data as any)?.players) ? (data as any).players.length :
      Array.isArray((data as any)?.lineMovement) ? (data as any).lineMovement.length :
      Array.isArray((data as any)?.lineProps) ? (data as any).lineProps.length :
      1
    ),
    data,
  };
}

export function digilanderModuleEmpty(reason: string): DigilanderModuleResponse<null> {
  return {
    status: 'empty',
    reason,
    count: 0,
    data: null,
  };
}

export function digilanderModuleLocked(reason: string): DigilanderModuleResponse<null> {
  return {
    status: 'locked',
    reason,
    count: 0,
    data: null,
  };
}

export function digilanderModuleFailed(reason: string): DigilanderModuleResponse<null> {
  return {
    status: 'failed',
    reason,
    count: 0,
    data: null,
  };
}

export function digilanderModuleAvailable(
  module: { status: DigilanderModuleStatus; count: number; data: any } | null | undefined,
): boolean {
  return Boolean(module && module.status === 'ready' && module.count > 0);
}

export function digilanderSafeArrayLength(value: any): number {
  return Array.isArray(value) ? value.length : 0;
}

export function digilanderModuleFromError(error: unknown, failedMessage: string): DigilanderModuleResponse<null> {
  const status = Number((error as any)?.status || 0);
  const message = (error as Error)?.message || failedMessage;

  if (status === 404) return digilanderModuleEmpty(message);
  if (status === 403) return digilanderModuleLocked(message);
  return digilanderModuleFailed(message || failedMessage);
}

export function digilanderSummarizeModule<T>(
  module: DigilanderModuleResponse<T>,
  summaryOnly: boolean,
): DigilanderModuleResponse<T> {
  if (!summaryOnly) return module;
  return {
    status: module.status,
    reason: module.reason,
    count: module.count,
    data: null,
  };
}
