import CardResult from '@pixelpay/sdk-core/lib/entities/CardResult';

/** Normaliza respuesta del plugin nativo (a veces viene como JSON string). */
export function normalizePixelPayResponse(raw: unknown): Record<string, unknown> {
  if (typeof raw === 'string') {
    try {
      const parsed = JSON.parse(raw);
      return typeof parsed === 'object' && parsed !== null ? (parsed as Record<string, unknown>) : { message: raw };
    } catch {
      return { message: raw };
    }
  }
  if (raw && typeof raw === 'object') {
    return raw as Record<string, unknown>;
  }
  return {};
}

/** Busca token T-* en varias rutas (web vs Capacitor Android/iOS). */
export function extractCardVaultToken(raw: unknown): string | null {
  const response = normalizePixelPayResponse(raw);

  try {
    if (CardResult.validateResponse(response)) {
      const result = CardResult.fromResponse(response);
      if (result?.token && String(result.token).startsWith('T-')) {
        return String(result.token);
      }
    }
  } catch {
    /* seguir con rutas alternativas */
  }

  try {
    const result = CardResult.fromResponse(response);
    if (result?.token && String(result.token).startsWith('T-')) {
      return String(result.token);
    }
  } catch {
    /* ignore */
  }

  const data = response.data as Record<string, unknown> | undefined;
  const nested = data?.data as Record<string, unknown> | undefined;
  const candidates = [
    data?.token,
    data?.card_token,
    nested?.token,
    response.token,
    response.card_token,
  ];

  for (const c of candidates) {
    if (typeof c === 'string' && c.startsWith('T-')) {
      return c;
    }
  }

  return null;
}

/** Mensaje de éxito de PixelPay aunque validateResponse falle (común en Android). */
export function isPixelPaySuccessMessage(message: string): boolean {
  const m = message.toLowerCase();
  return (
    m.includes('éxito') ||
    m.includes('exito') ||
    m.includes('success') ||
    m.includes('obtenida con')
  );
}

export function isCardVaultSuccess(raw: unknown): boolean {
  if (extractCardVaultToken(raw)) {
    return true;
  }
  const response = normalizePixelPayResponse(raw);
  if (response.success === true) {
    return true;
  }
  const msg = typeof response.message === 'string' ? response.message : '';
  return isPixelPaySuccessMessage(msg);
}
