import { useEffect, useState } from 'react'
import {
  PaginationState,
  SortingState,
  getCoreRowModel,
  getPaginationRowModel,
  getSortedRowModel,
  useReactTable,
} from '@tanstack/react-table'

import { useUserStore } from '@/src/store/userStore'
import { useColumns } from './useColumns'
import { useFetchStudents } from '@/src/hooks/user/students'

export const useStudentsTable = () => {
  const [isModalDeleteOpen, setModalDeleteOpen] = useState(false)
  const [isModalChangePasswordOpen, setModalChangePasswordOpen] =
    useState(false)
  const { setStudentSelected, clearStudentSelected } = useUserStore()

  const handleOpenModalChangePassword = (student: string) => {
    setStudentSelected(student)
    setModalChangePasswordOpen(true)
    setModalDeleteOpen(false)
  }

  const handleCloseModalChangePassword = () => {
    clearStudentSelected()
    setModalDeleteOpen(false)
    setModalChangePasswordOpen(false)
  }

  const handleOpenModalDelete = (student: string) => {
    setStudentSelected(student)
    setModalDeleteOpen(true)
    setModalChangePasswordOpen(false)
  }
  const handleCloseModalDelete = () => {
    clearStudentSelected()
    setModalDeleteOpen(false)
    setModalChangePasswordOpen(false)
  }

  const columns = useColumns({
    onOpenChangePasswordModal: handleOpenModalChangePassword,
    onOpenDeleteModal: handleOpenModalDelete,
  })

  const [sorting, setSorting] = useState<SortingState>([])
  const [search, setSearch] = useState('')

  const [pagination, setPagination] = useState<PaginationState>({
    pageIndex: 0,
    pageSize: 10,
  })

  const { data, refetch } = useFetchStudents({
    page: pagination.pageIndex + 1,
    pageSize: pagination.pageSize,
    search,
    sort: sorting.length
      ? `${sorting[0].id}:${sorting[0].desc ? 'desc' : 'asc'}`
      : '',
  })

  useEffect(() => {
    refetch()
  }, [pagination.pageIndex, pagination.pageSize, sorting, search])

  const { getHeaderGroups, getRowModel, setPageSize, getState, getPageCount } =
    useReactTable({
      columns,
      data: data?.students || [],
      getCoreRowModel: getCoreRowModel(),
      getSortedRowModel: getSortedRowModel(),
      onSortingChange: setSorting,
      getPaginationRowModel: getPaginationRowModel(),
      onPaginationChange: setPagination,
      state: {
        sorting,
        pagination,
      },
      manualPagination: true,
      pageCount: data?.totalPages ? data?.totalPages - 1 : 1,
    })

  return {
    search,
    columns,
    pagination,
    data,
    setPageSize,
    setSearch,
    getHeaderGroups,
    getRowModel,
    getState,
    getPageCount,
    setPagination,
    isModalDeleteOpen,
    isModalChangePasswordOpen,
    handleCloseModalChangePassword,
    handleCloseModalDelete,
  }
}
