import { ChevronDown } from 'lucide-react';
import { useState, useRef, useEffect } from 'react';
import { cn } from '../../lib/classname';
import {
  difficultyLevels,
  type DifficultyLevel,
} from '../GenerateCourse/AICourse';

type DifficultyDropdownProps = {
  value: DifficultyLevel;
  onChange: (value: DifficultyLevel) => void;
};

export function DifficultyDropdown(props: DifficultyDropdownProps) {
  const { value, onChange } = props;

  const [isOpen, setIsOpen] = useState(false);
  const dropdownRef = useRef<HTMLDivElement>(null);

  useEffect(() => {
    function handleClickOutside(event: MouseEvent) {
      if (
        dropdownRef.current &&
        !dropdownRef.current.contains(event.target as Node)
      ) {
        setIsOpen(false);
      }
    }

    document.addEventListener('mousedown', handleClickOutside);
    return () => document.removeEventListener('mousedown', handleClickOutside);
  }, []);

  return (
    <div className="relative" ref={dropdownRef}>
      <button
        type="button"
        onClick={() => setIsOpen(!isOpen)}
        className={cn(
          'flex items-center gap-2 rounded-full bg-gray-100 px-3 py-1 text-sm text-gray-700 hover:bg-gray-200 hover:text-black',
        )}
      >
        <span className="capitalize">{value}</span>
        <ChevronDown size={16} className={cn(isOpen && 'rotate-180')} />
      </button>

      {isOpen && (
        <div className="absolute z-10 mt-1 flex flex-col overflow-hidden rounded-md border border-gray-200 bg-white shadow-lg">
          {difficultyLevels.map((level) => (
            <button
              key={level}
              type="button"
              onClick={() => {
                onChange(level);
                setIsOpen(false);
              }}
              className={cn(
                'px-5 py-2 text-left text-sm capitalize hover:bg-gray-100',
                value === level && 'bg-gray-200 font-medium hover:bg-gray-200',
              )}
            >
              {level}
            </button>
          ))}
        </div>
      )}
    </div>
  );
}