import React, { useState, useEffect } from "react";
import styles from "./pagination.module.css";
import PropTypes from "prop-types";

function Pagination({ total, currentPage, onPageChange }) {
  //Set number of pages
  const numberOfPages = [];
  const totalPage = total <= 1 ? 1 : total;
  for (let i = 1; i <= totalPage; i++) {
    numberOfPages.push(i);
  }

  // Current active button number
  const [currentButton, setCurrentButton] = useState(1);

  // Array of buttons what we see on the page
  const [arrOfCurrButtons, setArrOfCurrButtons] = useState([]);
  useEffect(() => {
    let tempNumberOfPages = [...arrOfCurrButtons];

    let dotsInitial = "...";
    let dotsLeft = "...";
    let dotsRight = "...";

    if (numberOfPages.length < 6) {
      tempNumberOfPages = numberOfPages;
    } else if (currentButton >= 1 && currentButton <= 3) {
      tempNumberOfPages = [1, 2, 3, 4, dotsInitial, numberOfPages.length];
    } else if (currentButton === 4) {
      const sliced = numberOfPages.slice(0, 5);
      tempNumberOfPages = [...sliced, dotsInitial, numberOfPages.length];
    } else if (currentButton > 4 && currentButton < numberOfPages.length - 2) {
      // from 5 to 8 -> (10 - 2)
      const sliced1 = numberOfPages.slice(currentButton - 2, currentButton); // sliced1 (5-2, 5) -> [4,5]
      const sliced2 = numberOfPages.slice(currentButton, currentButton + 1); // sliced1 (5, 5+1) -> [6]
      tempNumberOfPages = [
        1,
        dotsLeft,
        ...sliced1,
        ...sliced2,
        dotsRight,
        numberOfPages.length,
      ];
    } else if (currentButton > numberOfPages.length - 3) {
      // > 7
      const sliced = numberOfPages.slice(numberOfPages.length - 4); // slice(10-4)
      tempNumberOfPages = [1, dotsLeft, ...sliced];
    }

    setArrOfCurrButtons(tempNumberOfPages);
  }, [total, currentButton]);

  //update currentButton value if currentPageNo changes
  useEffect(() => {
    setCurrentButton(currentPage);
  }, [currentPage]);

  //onClick function
  const handleCurrentPage = (item) => {
    setCurrentButton(item);
    onPageChange(item);
  };

  return (
    <div className={styles["pagination-container"]}>
      {arrOfCurrButtons.map((item, index) => {
        return (
          <a
            key={index}
            className={`${
              item === "..."
                ? styles["no-cursor"]
                : currentButton === item
                ? styles["active"]
                : ""
            }`}
            onClick={() => (item === "..." ? "" : handleCurrentPage(item))}
          >
            {item}
          </a>
        );
      })}

      <a
        className={`${
          currentButton === "..."
            ? styles["no-cursor"]
            : currentButton === numberOfPages.length
            ? styles["disabled"]
            : ""
        }`}
        onClick={() =>
          currentButton === "..." || currentButton === numberOfPages.length
            ? ""
            : handleCurrentPage(currentButton + 1)
        }
      >
        <span className={styles.next}>Next ยป</span>
      </a>
    </div>
  );
}

Pagination.propTypes = {
  total: PropTypes.number.isRequired,
  currentPage: PropTypes.number,
};
export default Pagination;