import { CellContext } from '@tanstack/react-table';
import { Check, File as FileIcon, Folder, X } from 'lucide-react';
import { Form, Formik } from 'formik';

import { Icon } from '@@/Icon';
import { Button } from '@@/buttons';
import { Input } from '@@/form-components/Input';

import { FileData, isFilesTableMeta } from '../types';

export function NameCell({
  getValue,
  row: { original: item },
  table,
}: CellContext<FileData, string>) {
  const name = getValue();
  const { meta } = table.options;
  if (!isFilesTableMeta(meta)) {
    throw new Error('Invalid table meta');
  }
  const isEdit = meta.isEdit(name);

  if (item.custom) {
    return item.custom;
  }

  if (isEdit) {
    return (
      <EditForm
        originalName={name}
        onSave={handleRename}
        onClose={() => meta.setIsEdit(name, false)}
      />
    );
  }

  return (
    <>
      {item.Dir ? (
        <Button
          color="link"
          className="!ml-0 p-0"
          onClick={() => meta.onBrowse(name)}
          icon={Folder}
          data-cy={`file-browse-${name}`}
        >
          {name}
        </Button>
      ) : (
        <span className="vertical-center">
          <Icon icon={FileIcon} />
          {name}
        </span>
      )}
    </>
  );

  function handleRename(name: string) {
    if (!isFilesTableMeta(meta)) {
      throw new Error('Invalid table meta');
    }

    meta.onRename(item.Name, name);
    meta.setIsEdit(name, false);
  }
}

function EditForm({
  originalName,
  onSave,
  onClose,
}: {
  originalName: string;
  onSave: (name: string) => void;
  onClose: () => void;
}) {
  return (
    <Formik
      initialValues={{ name: originalName }}
      onSubmit={({ name }) => onSave(name)}
      onReset={onClose}
    >
      {({ values, setFieldValue }) => (
        <Form className="flex items-center">
          <Input
            name="name"
            value={values.name}
            onChange={(e) => setFieldValue('name', e.target.value)}
            className="input-sm w-auto"
            data-cy={`file-rename-${originalName}`}
          />

          <Button
            color="none"
            type="reset"
            icon={X}
            data-cy={`file-reset-button-${originalName}`}
          />

          <Button
            color="none"
            type="submit"
            icon={Check}
            data-cy={`file-submit-button-${originalName}`}
          />
        </Form>
      )}
    </Formik>
  );
}