import { useQuery } from '@tanstack/react-query';
import EmptyPlaceholder from 'components/common/EmptyPlaceholder';
import { formatDistance } from 'date-fns';
import useApi from 'hooks/useApi';
import Link from 'next/link';
import { useEffect, useState } from 'react';
import {
  Button,
  Icon,
  Table,
  TableBody,
  TableCell,
  TableColumn,
  TableHeader,
  TableRow,
} from 'react-basics';
import styles from './UsersTable.module.css';

const defaultColumns = [
  { name: 'username', label: 'Username', style: { flex: 2 } },
  { name: 'role', label: 'Role', style: { flex: 2 } },
  { name: 'created', label: 'Created' },
  { name: 'action', label: ' ' },
];

export default function UsersTable({ columns = defaultColumns, onLoading, onAddKeyClick }) {
  const [values, setValues] = useState(null);
  const { get } = useApi();
  const { data, isLoading, error } = useQuery(['user'], () => get(`/users`));
  const hasData = data && data.length !== 0;

  useEffect(() => {
    if (data) {
      setValues(data);
      onLoading({ data, isLoading, error });
    }
  }, [onLoading, data, isLoading, error]);

  return (
    <>
      {hasData && (
        <Table className={styles.table} columns={columns} rows={values}>
          <TableHeader>
            {(column, index) => {
              return (
                <TableColumn key={index} className={styles.header} style={{ ...column.style }}>
                  {column.label}
                </TableColumn>
              );
            }}
          </TableHeader>
          <TableBody>
            {(row, keys, rowIndex) => {
              row.created = formatDistance(new Date(row.createdAt), new Date(), {
                addSuffix: true,
              });

              row.action = (
                <div className={styles.actions}>
                  <Link href={`/users/${row.id}`} shallow>
                    <a>
                      <Button>
                        <Icon icon="arrow-right" />
                        Settings
                      </Button>
                    </a>
                  </Link>
                </div>
              );

              return (
                <TableRow key={rowIndex} data={row} keys={keys}>
                  {(data, key, colIndex) => {
                    return (
                      <TableCell
                        key={colIndex}
                        className={styles.cell}
                        style={{ ...columns[colIndex]?.style }}
                      >
                        {data[key]}
                      </TableCell>
                    );
                  }}
                </TableRow>
              );
            }}
          </TableBody>
        </Table>
      )}
      {!hasData && (
        <EmptyPlaceholder className={styles.empty} msg="You don't have any Users.">
          <Button variant="primary" onClick={onAddKeyClick}>
            <Icon icon="plus" /> Create User
          </Button>
        </EmptyPlaceholder>
      )}
    </>
  );
}