import { useEffect, useState } from 'react';
import clsx from 'clsx';
import { ChevronUp, ChevronRight, Edit } from 'lucide-react';

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

export type Props = {
  onChange: (value: string) => void;
  defaultIsOpen?: boolean;
  value?: string;
  labelClass?: string;
  inputClass?: string;
  isRequired?: boolean;
  minLength?: number;
  isExpandable?: boolean;
};

export function Note({
  onChange,
  defaultIsOpen,
  value,
  labelClass = 'col-sm-12 mb-2',
  inputClass = 'col-sm-12',
  isRequired,
  minLength,
  isExpandable,
}: Props) {
  const [isNoteOpen, setIsNoteOpen] = useState(defaultIsOpen || isRequired);

  useEffect(() => {
    setIsNoteOpen(defaultIsOpen || isRequired);
  }, [defaultIsOpen, isRequired]);

  let error = '';
  if (isRequired && minLength && (!value || value.length < minLength)) {
    error = `You have entered ${value ? value.length : 0} of the ${minLength} ${
      minLength === 1 ? 'character' : 'characters'
    } minimum required.`;
  }

  return (
    <div className="form-group">
      <div className={clsx('vertical-center', labelClass)}>
        {isExpandable && (
          <Button
            size="small"
            type="button"
            color="none"
            data-cy="k8sAppDetail-expandNoteButton"
            onClick={() => setIsNoteOpen(!isNoteOpen)}
            className="!m-0 !p-0"
          >
            {isNoteOpen ? <ChevronUp /> : <ChevronRight />} <Edit />
            <span className={isRequired ? 'required' : ''}>Note</span>
          </Button>
        )}
        {!isExpandable && (
          <span
            className={clsx(
              'control-label text-left',
              isRequired ? 'required' : ''
            )}
          >
            Note
          </span>
        )}
      </div>

      {isNoteOpen && (
        <div className={inputClass}>
          <textarea
            className="form-control resize-y"
            name="application_note"
            id="application_note"
            value={value}
            onChange={(e) => onChange(e.target.value)}
            rows={5}
            placeholder="Enter a note about this application..."
            minLength={minLength}
          />
          {error && (
            <FormError className="error-inline mt-2">{error}</FormError>
          )}
        </div>
      )}
    </div>
  );
}