import { createElement } from 'react'
import {
  Anchor, Award, Banknote, BarChart3, BookOpen, Brain, Briefcase, Calendar, Camera,
  ChevronsDownUp, CircleHelp, Clock, Coffee, Columns2, Compass, DollarSign, Film,
  Flag, Folder, GraduationCap, GripVertical, Handshake, Heading, Heart, Hourglass,
  Image, Images, Info, Key, Layers, LayoutGrid, Lightbulb, Library, LineChart,
  ListOrdered, Mail, MapPin, Megaphone, MessageCircle, Mic, Milestone, Minus,
  MousePointerClick, NotebookPen, Palette, Play, Podcast, Presentation, Puzzle,
  Quote, Repeat, Rocket, School, Search, Send, Settings, Shield, Smile, Sparkles,
  Star, Target, ThumbsUp, Timer, TrendingUp, Trophy, Type, Users, Video, Zap,
  BookMarked, Bell, Download, Eye, FileText, Home,
} from 'lucide-react'

export type IconName = string

// Mapa nome -> componente (para renderizar ícones salvos nos blocos)
const ICON_MAP: Record<IconName, React.ComponentType<{ className?: string }>> = {
  Anchor, Award, Banknote, BarChart3, Bell, BookMarked, BookOpen, Brain, Briefcase,
  Calendar, Camera, ChevronsDownUp, CircleHelp, Clock, Coffee, Columns2, Compass,
  DollarSign, Download, Eye, FileText, Film, Flag, Folder, GraduationCap, Handshake,
  Heading, Heart, Home, Hourglass, Image, Images, Info, Key, Layers, LayoutGrid,
  Lightbulb, Library, LineChart, ListOrdered, Mail, MapPin, Megaphone, MessageCircle,
  Mic, Milestone, Minus, MousePointerClick, NotebookPen, Palette, Play, Podcast,
  Presentation, Puzzle, Quote, Repeat, Rocket, School, Search, Send, Settings,
  Shield, Smile, Sparkles, Star, Target, ThumbsUp, Timer, TrendingUp, Trophy, Type,
  Users, Video, Zap,
}

// Lista usada no seletor de ícones
export const ICON_OPTIONS = Object.keys(ICON_MAP).sort((a, b) => a.localeCompare(b))

export function getIcon(name: string | undefined | null): React.ComponentType<{ className?: string }> {
  if (!name) return Sparkles
  return ICON_MAP[name] ?? Sparkles
}

// Renderiza um ícone dinamicamente pelo nome (sem criar componentes durante o render)
export function DynIcon({ name, className }: { name?: string | null; className?: string }) {
  return createElement(getIcon(name), { className })
}

export { Sparkles as FallbackIcon }
