import { useState } from 'react'
import { Image as ImageIcon } from 'lucide-react'
import { cn } from '@/lib/utils'
import { DynIcon } from '@/lib/blocks/icons'
import { RichText } from '@/lib/blocks/richText'
import type {
  NumericCardsData, IconCardsData, ImageCardsData, StatsData,
} from '@/lib/blocks/types'
import { BlockRenderProps, EmptyHint, SectionTitle, gridCols } from './shared'

export function NumericCardsBlock({ data }: BlockRenderProps<NumericCardsData>) {
  return (
    <div>
      <SectionTitle title={data.title} />
      {data.items.length === 0 ? (
        <EmptyHint label="Adicione itens numéricos no painel de propriedades" />
      ) : (
        <div className={cn('grid gap-4', gridCols(data.items.length))}>
          {data.items.map((item, i) => (
            <div
              key={i}
              className="group rounded-xl border border-slate-200 bg-white p-5 shadow-sm transition-all hover:-translate-y-0.5 hover:shadow-md"
            >
              <span
                className="mb-4 flex h-9 w-9 items-center justify-center rounded-full text-sm font-bold text-white"
                style={{ backgroundColor: 'var(--cp)' }}
              >
                {String(i + 1).padStart(2, '0')}
              </span>
              <h4 className="mb-1.5 text-base font-semibold text-slate-900">{item.title || `Item ${i + 1}`}</h4>
              <RichText text={item.description} className="text-sm leading-relaxed text-slate-600" />
            </div>
          ))}
        </div>
      )}
    </div>
  )
}

export function IconCardsBlock({ data }: BlockRenderProps<IconCardsData>) {
  return (
    <div>
      <SectionTitle title={data.title} />
      {data.items.length === 0 ? (
        <EmptyHint label="Adicione itens com ícones no painel de propriedades" />
      ) : (
        <div className={cn('grid gap-4', gridCols(data.items.length))}>
          {data.items.map((item, i) => (
            <div
              key={i}
              className="rounded-xl border border-slate-200 bg-white p-5 text-center shadow-sm transition-all hover:-translate-y-0.5 hover:shadow-md"
            >
              <div
                className="mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-xl"
                style={{ backgroundColor: 'var(--cpt)', color: 'var(--cpd)' }}
                aria-hidden
              >
                <DynIcon name={item.icon} className="h-6 w-6" />
              </div>
              <h4 className="mb-1.5 text-base font-semibold text-slate-900">{item.title || `Item ${i + 1}`}</h4>
              <RichText text={item.description} className="text-sm leading-relaxed text-slate-600" />
            </div>
          ))}
        </div>
      )}
    </div>
  )
}

function CardImage({ src, alt }: { src: string; alt: string }) {
  const [failed, setFailed] = useState(false)
  if (!src || failed) {
    return (
      <div className="flex h-44 w-full items-center justify-center bg-gradient-to-br from-slate-100 to-slate-200 text-slate-400">
        <ImageIcon className="h-8 w-8" />
      </div>
    )
  }
  return (
    <img
      src={src}
      alt={alt}
      className="h-44 w-full object-cover transition-transform duration-300 group-hover:scale-105"
      onError={() => setFailed(true)}
      loading="lazy"
    />
  )
}

export function ImageCardsBlock({ data }: BlockRenderProps<ImageCardsData>) {
  return (
    <div>
      <SectionTitle title={data.title} />
      {data.items.length === 0 ? (
        <EmptyHint label="Adicione cards com imagens no painel de propriedades" />
      ) : (
        <div className={cn('grid gap-4', gridCols(data.items.length))}>
          {data.items.map((item, i) => (
            <div
              key={i}
              className="group overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm transition-all hover:-translate-y-0.5 hover:shadow-md"
            >
              <div className="overflow-hidden">
                <CardImage src={item.imageUrl} alt={item.title} />
              </div>
              <div className="p-4">
                <h4 className="mb-1 text-base font-semibold text-slate-900">{item.title || `Card ${i + 1}`}</h4>
                <RichText text={item.description} className="text-sm leading-relaxed text-slate-600" />
              </div>
            </div>
          ))}
        </div>
      )}
    </div>
  )
}

export function StatsBlock({ data }: BlockRenderProps<StatsData>) {
  return (
    <div>
      <SectionTitle title={data.title} />
      {data.items.length === 0 ? (
        <EmptyHint label="Adicione indicadores no painel de propriedades" />
      ) : (
        <div className={cn('grid gap-4', gridCols(data.items.length))}>
          {data.items.map((item, i) => (
            <div
              key={i}
              className="rounded-xl border p-6 text-center"
              style={{ backgroundColor: 'var(--cpt)', borderColor: 'var(--cps)' }}
            >
              <p className="text-3xl font-extrabold tracking-tight md:text-4xl" style={{ color: 'var(--cpd)' }}>
                {item.value || '—'}
              </p>
              <p className="mt-1.5 text-sm font-medium text-slate-600">{item.label}</p>
            </div>
          ))}
        </div>
      )}
    </div>
  )
}
