export interface PostDocumentItem {
  url: string;
  name: string;
}

type MaybeDocumentObject = {
  url?: string;
  name?: string;
};

type PostWithDocuments = {
  docs?: Array<MaybeDocumentObject | string> | string[];
  document?: MaybeDocumentObject | string | null;
  document_url?: string;
  document_name?: string;
  document_urls?: string[];
  documents?: Array<MaybeDocumentObject | string>;
};

export const getFileNameFromUrl = (url = '') => {
  if (!url) return 'Document';
  const cleanUrl = url.split('?')[0];
  const fileName = cleanUrl.split('/').pop();
  return fileName || 'Document';
};

export const getPostDocuments = (post?: PostWithDocuments | null): PostDocumentItem[] => {
  if (!post) return [];

  if (Array.isArray(post.docs) && post.docs.length > 0) {
    return post.docs
      .map((doc) =>
        typeof doc === 'string'
          ? { url: doc, name: getFileNameFromUrl(doc) }
          : { url: doc?.url, name: doc?.name || getFileNameFromUrl(doc?.url) }
      )
      .filter((doc): doc is PostDocumentItem => Boolean(doc.url));
  }

  if (post.document && typeof post.document === 'object' && post.document.url) {
    return [
      {
        url: post.document.url,
        name: post.document.name || getFileNameFromUrl(post.document.url)
      }
    ];
  }

  if (typeof post.document === 'string') {
    return [
      {
        url: post.document,
        name: post.document_name || getFileNameFromUrl(post.document)
      }
    ];
  }

  if (post.document_url) {
    return [
      {
        url: post.document_url,
        name: post.document_name || getFileNameFromUrl(post.document_url)
      }
    ];
  }

  if (Array.isArray(post.document_urls) && post.document_urls.length > 0) {
    return post.document_urls.map((url) => ({ url, name: post.document_name || getFileNameFromUrl(url) }));
  }

  if (Array.isArray(post.documents) && post.documents.length > 0) {
    return post.documents
      .map((doc) =>
        typeof doc === 'string'
          ? { url: doc, name: post.document_name || getFileNameFromUrl(doc) }
          : { url: doc?.url, name: doc?.name || getFileNameFromUrl(doc?.url) }
      )
      .filter((doc): doc is PostDocumentItem => Boolean(doc.url));
  }

  return [];
};
