'use client'

import { useState } from 'react'
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, DropdownMenuSeparator } from '@/components/ui/dropdown-menu'
import { Button } from '@/components/ui/button'
import { Badge } from '@/components/ui/badge'
import { Input } from '@/components/ui/input'
import { Tag, Plus, Check } from 'lucide-react'
import { cn } from '@/lib/utils'
import { useNotebooks } from '@/context/notebooks-context'
import { LabelBadge } from './label-badge'
import { useLanguage } from '@/lib/i18n'

interface LabelSelectorProps {
  selectedLabels: string[]
  onLabelsChange: (labels: string[]) => void
  variant?: 'default' | 'compact'
  triggerLabel?: string
  align?: 'start' | 'center' | 'end'
}

export function LabelSelector({
  selectedLabels,
  onLabelsChange,
  variant = 'default',
  triggerLabel,
  align = 'start',
}: LabelSelectorProps) {
  const { labels, isLoading: loading, addLabel } = useNotebooks()
  const { t } = useLanguage()
  const [search, setSearch] = useState('')

  const filteredLabels = labels.filter(l => 
    l.name.toLowerCase().includes(search.toLowerCase())
  )

  const handleToggleLabel = (labelName: string) => {
    if (selectedLabels.includes(labelName)) {
      onLabelsChange(selectedLabels.filter((l) => l !== labelName))
    } else {
      onLabelsChange([...selectedLabels, labelName])
    }
  }

  const handleCreateLabel = async () => {
    const trimmed = search.trim()
    if (trimmed) {
      await addLabel(trimmed) // Let backend assign random color
      onLabelsChange([...selectedLabels, trimmed])
      setSearch('')
    }
  }

  const showCreateOption = search.trim() && !labels.some(l => l.name.toLowerCase() === search.trim().toLowerCase())

  return (
    <DropdownMenu>
      <DropdownMenuTrigger asChild>
        <Button variant="ghost" size={variant === 'compact' ? 'icon' : 'sm'} className={cn("h-8 text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-gray-100", variant === 'compact' ? "w-8 relative" : "px-2")} title={t('labels.title')}>
          <Tag className={cn("h-4 w-4", variant !== 'compact' && (triggerLabel || t('labels.title')) ? "mr-2" : "")} />
          {variant !== 'compact' && (triggerLabel || t('labels.title'))}
          {selectedLabels.length > 0 && (
            <Badge variant="secondary" className={cn("h-5 min-w-5 px-1.5 bg-gray-200 text-gray-800 dark:bg-zinc-700 dark:text-zinc-300", variant === 'compact' ? "absolute -top-2 -right-2 scale-75" : "ml-2")}>
              {selectedLabels.length}
            </Badge>
          )}
        </Button>
      </DropdownMenuTrigger>
      <DropdownMenuContent align={align} className="w-64 p-0">
        <div className="p-2">
          <Input
            placeholder={t('labels.namePlaceholder')}
            value={search}
            onChange={(e) => setSearch(e.target.value)}
            className="h-8 text-sm"
            onKeyDown={(e) => {
              if (e.key === 'Enter') {
                e.preventDefault()
                if (showCreateOption) handleCreateLabel()
              }
            }}
          />
        </div>
        
        <div className="max-h-64 overflow-y-auto px-1 pb-1">
          {loading ? (
            <div className="p-2 text-sm text-gray-500 text-center">{t('general.loading')}</div>
          ) : (
            <>
              {filteredLabels.map((label) => {
                const isSelected = selectedLabels.includes(label.name)
                return (
                  <div
                    key={label.id}
                    onClick={(e) => {
                      e.preventDefault()
                      handleToggleLabel(label.name)
                    }}
                    className="flex items-center gap-2 p-2 rounded-sm cursor-pointer text-sm hover:bg-accent hover:text-accent-foreground"
                  >
                    <div className={cn(
                      "h-4 w-4 border rounded flex items-center justify-center transition-colors",
                      isSelected ? "bg-primary border-primary text-primary-foreground" : "border-gray-400"
                    )}>
                      {isSelected && <Check className="h-3 w-3" />}
                    </div>
                    <LabelBadge label={label.name} variant="clickable" />
                  </div>
                )
              })}

              {showCreateOption && (
                <div
                  onClick={(e) => {
                    e.preventDefault()
                    handleCreateLabel()
                  }}
                  className="flex items-center gap-2 p-2 rounded-sm cursor-pointer text-sm border-t mt-1 font-medium hover:bg-accent hover:text-accent-foreground"
                >
                  <Plus className="h-4 w-4" />
                  <span>{t('labels.createLabel', { name: search })}</span>
                </div>
              )}

              {filteredLabels.length === 0 && !showCreateOption && (
                <div className="p-2 text-sm text-gray-500 text-center">{t('labels.noLabelsFound')}</div>
              )}
            </>
          )}
        </div>
      </DropdownMenuContent>
    </DropdownMenu>
  )
}
