import { useMemo } from 'react';
import { useAccount, useAccountComment } from '@bitsocial/bitsocial-react-hooks';

type SafeAccountCommentOptions = {
  accountName?: string;
  commentCid?: string;
  commentIndex?: number | string;
};

const EMPTY_ACCOUNT_COMMENT_LOOKUP = Object.freeze({ commentIndex: -1 as const });

const normalizeCommentIndex = (commentIndex: SafeAccountCommentOptions['commentIndex']) => {
  if (commentIndex === undefined || commentIndex === null || commentIndex === '') {
    return undefined;
  }

  const normalizedCommentIndex = Number(commentIndex);

  return Number.isInteger(normalizedCommentIndex) && normalizedCommentIndex >= 0 ? normalizedCommentIndex : undefined;
};

const useSafeAccountComment = (options?: SafeAccountCommentOptions) => {
  const account = useAccount(options?.accountName ? { accountName: options.accountName } : undefined);
  const normalizedCommentIndex = normalizeCommentIndex(options?.commentIndex);

  const safeOptions = useMemo(() => {
    if (typeof normalizedCommentIndex === 'number') {
      return {
        ...(options?.accountName ? { accountName: options.accountName } : {}),
        commentIndex: normalizedCommentIndex,
      };
    }

    if (options?.commentCid && account?.id) {
      return {
        ...(options?.accountName ? { accountName: options.accountName } : {}),
        commentCid: options.commentCid,
      };
    }

    return EMPTY_ACCOUNT_COMMENT_LOOKUP;
  }, [account?.id, normalizedCommentIndex, options?.accountName, options?.commentCid]);

  return useAccountComment(safeOptions);
};

export default useSafeAccountComment;
