import * as React from 'react'
import { cn } from '@/lib/utils'

/**
 * Table primitives — shadcn-style atomic wrappers. Замена @nstart/ui Table*.
 *
 * <p>Per handoff: table cell text = text-cell (12.5/500). Применяется на
 * &lt;td/th&gt; через CSS rule в `<tbody>` — но проще baked-in via TableCell
 * className. Caller может override через className prop.
 *
 * <p>TableEmpty — single full-width row для empty state.
 */

export const Table = React.forwardRef<HTMLTableElement, React.HTMLAttributes<HTMLTableElement>>(
  function Table({ className, ...props }, ref) {
    return (
      <div className="w-full overflow-x-auto">
        <table
          ref={ref}
          className={cn('w-full caption-bottom text-cell', className)}
          {...props}
        />
      </div>
    )
  },
)

export const TableHeader = React.forwardRef<
  HTMLTableSectionElement,
  React.HTMLAttributes<HTMLTableSectionElement>
>(function TableHeader({ className, ...props }, ref) {
  return (
    <thead
      ref={ref}
      className={cn('[&_tr]:border-b [&_tr]:border-line', className)}
      {...props}
    />
  )
})
// nstart-compat alias: nstart использовал <TableHead> как THEAD wrapper.
// shadcn по convention использует TableHead как TH cell — это конфликтовало
// (callsites писали `<TableHead><TableRow>...` ожидая THEAD-семантику).
// Резолвим в пользу nstart-compat (callsites больше). Для TH cell — TableHeaderCell.
export const TableHead = TableHeader

export const TableBody = React.forwardRef<
  HTMLTableSectionElement,
  React.HTMLAttributes<HTMLTableSectionElement>
>(function TableBody({ className, ...props }, ref) {
  return (
    <tbody
      ref={ref}
      className={cn('[&_tr:last-child]:border-0', className)}
      {...props}
    />
  )
})

export const TableFooter = React.forwardRef<
  HTMLTableSectionElement,
  React.HTMLAttributes<HTMLTableSectionElement>
>(function TableFooter({ className, ...props }, ref) {
  return (
    <tfoot
      ref={ref}
      className={cn(
        'border-t border-line bg-surface-2 font-medium [&>tr]:last:border-b-0',
        className,
      )}
      {...props}
    />
  )
})

export const TableRow = React.forwardRef<HTMLTableRowElement, React.HTMLAttributes<HTMLTableRowElement>>(
  function TableRow({ className, ...props }, ref) {
    return (
      <tr
        ref={ref}
        className={cn(
          // White row bg + clear hover state per user feedback ("строки белые,
          // ховер более чёткий"). Прошлый /40 opacity на hover был еле виден.
          'border-b border-line bg-surface transition-colors hover:bg-surface-2 data-[state=selected]:bg-accent-bg',
          className,
        )}
        {...props}
      />
    )
  },
)

export type TableHeaderCellProps = React.ThHTMLAttributes<HTMLTableCellElement> & {
  align?: 'left' | 'center' | 'right'
  /** Hide column на narrow viewports per handoff line 466:
   *  - 'sm' — hide <640px (table cells 6-7 columns secondary)
   *  - 'md' — hide <768px
   *  - 'lg' — hide <1024px
   *  Используется pair с same prop на соответствующих TableCell. */
  hideBelow?: 'sm' | 'md' | 'lg'
  sortable?: boolean
  sortDirection?: 'asc' | 'desc' | 'none'
}

const HIDE_BELOW: Record<NonNullable<TableHeaderCellProps['hideBelow']>, string> = {
  sm: 'hidden sm:table-cell',
  md: 'hidden md:table-cell',
  lg: 'hidden lg:table-cell',
}

export const TableHeaderCell = React.forwardRef<HTMLTableCellElement, TableHeaderCellProps>(
  function TableHeaderCell(
    { className, align = 'left', hideBelow, sortable, sortDirection, ...props },
    ref,
  ) {
    const ariaSort =
      sortDirection === 'asc'
        ? 'ascending'
        : sortDirection === 'desc'
          ? 'descending'
          : sortable
            ? 'none'
            : undefined
    return (
      <th
        ref={ref}
        scope="col"
        aria-sort={ariaSort}
        className={cn(
          'h-9 px-3 align-middle text-cap text-mute',
          align === 'right' && 'text-right',
          align === 'center' && 'text-center',
          align === 'left' && 'text-left',
          hideBelow && HIDE_BELOW[hideBelow],
          '[&:has([role=checkbox])]:pr-0',
          className,
        )}
        {...props}
      />
    )
  },
)

export type TableCellProps = React.TdHTMLAttributes<HTMLTableCellElement> & {
  /** Pair с TableHeaderCell.hideBelow — column скрывается на narrow viewport. */
  hideBelow?: 'sm' | 'md' | 'lg'
}

export const TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(
  function TableCell({ className, hideBelow, ...props }, ref) {
    return (
      <td
        ref={ref}
        className={cn(
          'px-3 py-2 align-middle',
          hideBelow && HIDE_BELOW[hideBelow],
          '[&:has([role=checkbox])]:pr-0',
          className,
        )}
        {...props}
      />
    )
  },
)

export const TableCaption = React.forwardRef<
  HTMLTableCaptionElement,
  React.HTMLAttributes<HTMLTableCaptionElement>
>(function TableCaption({ className, ...props }, ref) {
  return (
    <caption
      ref={ref}
      className={cn('mt-3 text-cell text-mute', className)}
      {...props}
    />
  )
})

/**
 * TableEmpty — full-width row с заглушкой "ничего не найдено".
 * Замена @nstart/ui TableEmptyRow API: <TableEmpty colSpan={N}>{text}</TableEmpty>.
 */
export type TableEmptyProps = React.TdHTMLAttributes<HTMLTableCellElement> & {
  colSpan: number
}

export function TableEmpty({ colSpan, className, children, ...props }: TableEmptyProps) {
  return (
    <tr>
      <td
        colSpan={colSpan}
        className={cn('py-10 text-center text-cell text-mute', className)}
        {...props}
      >
        {children}
      </td>
    </tr>
  )
}
