import './ContentSection.scss';

import { useContext, useEffect, useState } from 'react';

import { Pagination } from '@/components/shared/Pagination/Pagination';
import { isEmbedded } from '@/shared/iframe-detector';
import { sendScrollMessage } from '@/shared/iframe-message-emitter';
import { INotebookMetadata } from '@/shared/notebook-metadata';
import { notebooksService } from '@/shared/notebooks.service';
import { NotebooksContext } from '@/shared/notebooks-context';

import { ContentSectionHeader } from './ContentSectionHeader/ContentSectionHeader';
import { NotebooksList } from './NotebooksList/NotebooksList';

const notebooksPerPageOptions = [5, 10, 25, 50];

const scrollToTop = () => {
  if (isEmbedded) {
    sendScrollMessage();
  } else {
    window.scrollTo({ top: 0, behavior: 'smooth' });
  }
};

export const ContentSection = (): JSX.Element => {
  const { selectedTags, searchValue, sort, page, setPage } = useContext(NotebooksContext);

  const [notebooks, setNotebooks] = useState<INotebookMetadata[]>([]);
  const [filteredNotebooksCount, setFilteredNotebooksCount] = useState<number>(0);
  const [totalNotebooksCount, setTotalNotebooksCount] = useState<number>(0);

  const [itemsPerPage, setItemsPerPage] = useState<number>(notebooksPerPageOptions[0]);

  const totalPages = Math.ceil(filteredNotebooksCount / itemsPerPage);

  useEffect(() => {
    setPage(1);
  }, [selectedTags, searchValue, sort, setPage]);

  useEffect(() => {
    void notebooksService
      .getNotebooks({
        tags: selectedTags,
        searchValue,
        sort,
        offset: (page - 1) * itemsPerPage,
        limit: itemsPerPage,
      })
      .then(([paginatedNotebooks, totalSearchedNotebooks, totalNotebooksCount]) => {
        setNotebooks(paginatedNotebooks);
        setFilteredNotebooksCount(totalSearchedNotebooks);
        setTotalNotebooksCount(totalNotebooksCount);
        scrollToTop();
      });
  }, [selectedTags, searchValue, sort, page, itemsPerPage]);

  return (
    <section className="flex-col flex-1 content-section">
      <ContentSectionHeader
        totalCount={totalNotebooksCount}
        filteredCount={filteredNotebooksCount}
      ></ContentSectionHeader>
      <NotebooksList items={notebooks}></NotebooksList>
      {Boolean(notebooks.length) && (
        <Pagination
          itemsPerPageOptions={notebooksPerPageOptions}
          itemsPerPage={itemsPerPage}
          page={page}
          totalPages={totalPages}
          onChangePage={setPage}
          onChangeItemsPerPage={setItemsPerPage}
        ></Pagination>
      )}
    </section>
  );
};