import { useState } from 'react'
import type { StepCategoryListItem } from '@/types'
import { Modal } from '@/components/common/Modal'
import { Button } from '@/components/ui/Button'
import { Input } from '@/components/ui/Input'
import { Textarea } from '@/components/ui/Textarea'

interface EditCategoryModalProps {
  isOpen: boolean
  onClose: () => void
  onSubmit: (data: { name: string; description: string }) => Promise<void>
  category: StepCategoryListItem | null
  isSaving?: boolean
}

export function EditCategoryModal({
  isOpen,
  onClose,
  onSubmit,
  category,
  isSaving = false
}: EditCategoryModalProps) {
  const [name, setName] = useState('')
  const [description, setDescription] = useState('')
  const [error, setError] = useState('')
  const [prevCategoryId, setPrevCategoryId] = useState<string | null>(null)

  // Pre-populate form when category changes (state-based tracking)
  if (category && category.id !== prevCategoryId) {
    setPrevCategoryId(category.id)
    setName(category.name)
    setDescription(category.description || '')
  }
  if (!category && prevCategoryId !== null) {
    setPrevCategoryId(null)
  }

  if (!category) return null

  const handleSubmit = async (e: React.FormEvent) => {
    e.preventDefault()
    setError('')

    if (!name.trim()) {
      setError('Category name is required')
      return
    }

    if (name.length > 100) {
      setError('Category name must be 100 characters or less')
      return
    }

    try {
      await onSubmit({
        name: name.trim(),
        description: description.trim()
      })
    } catch {
      setError('Failed to update category')
    }
  }

  const handleClose = () => {
    if (!isSaving) {
      setError('')
      onClose()
    }
  }

  return (
    <Modal
      isOpen={isOpen}
      onClose={handleClose}
      title="Edit Category"
      size="sm"
      footer={
        <div className="flex justify-end gap-2">
          <Button
            type="button"
            variant="secondary"
            onClick={handleClose}
            disabled={isSaving}
          >
            Cancel
          </Button>
          <Button
            type="submit"
            form="edit-category-form"
            disabled={!name.trim()}
            loading={isSaving}
          >
            Save Changes
          </Button>
        </div>
      }
    >
      <form id="edit-category-form" onSubmit={handleSubmit} className="space-y-4">
        {error && (
          <div className="rounded-md bg-red-400/10 p-3 text-sm text-red-400">
            {error}
          </div>
        )}

        <div>
          <label htmlFor="edit-name" className="mb-1 block text-sm font-medium text-[#e2e5eb]">
            Category Name <span className="text-red-400">*</span>
          </label>
          <Input
            id="edit-name"
            type="text"
            value={name}
            onChange={(e) => setName(e.target.value)}
            disabled={isSaving}
            maxLength={100}
            placeholder="e.g., Network Troubleshooting"
            required
          />
          <p className="mt-1 text-xs text-[#848b9b]">
            {name.length}/100 characters
          </p>
        </div>

        <div>
          <label htmlFor="edit-description" className="mb-1 block text-sm font-medium text-[#e2e5eb]">
            Description <span className="text-[#848b9b]">(optional)</span>
          </label>
          <Textarea
            id="edit-description"
            value={description}
            onChange={(e) => setDescription(e.target.value)}
            disabled={isSaving}
            rows={3}
            placeholder="Brief description of this category..."
          />
        </div>
      </form>
    </Modal>
  )
}
