import { useRef } from 'react'
import { Link, useNavigate } from 'react-router-dom'
import { Plus, Truck } from 'lucide-react'
import { ListPageShell } from '@/components/ListPageShell'
import { DataTable } from '@/components/DataTable'
import { EmptyState } from '@/components/EmptyState'
import { Pagination } from '@/components/Pagination'
import { SearchBar } from '@/components/SearchBar'
import { Button } from '@/components/Button'
import { useCatalogList } from '@/lib/useCatalog'
import { useShortcuts } from '@/lib/useShortcuts'
import { useOrgSettings } from '@/lib/useOrgSettings'
import { type DemandListRow, DemandStatus, demandPaymentLabel } from '@/lib/types'

const URL = '/api/sales/demands'

export function DemandsPage() {
  const navigate = useNavigate()
  const { data, isLoading, page, setPage, search, setSearch, sortKey, sortOrder, setSort } = useCatalogList<DemandListRow>(URL)
  const org = useOrgSettings()
  const fractional = org.data?.allowFractionalPrices ?? false
  const moneyFmt = fractional
    ? { minimumFractionDigits: 2, maximumFractionDigits: 2 }
    : { maximumFractionDigits: 0 }
  const searchRef = useRef<HTMLInputElement>(null)

  // Хоткеи list-страницы: `/` фокусит поиск, `n` — создать новую отгрузку.
  useShortcuts({
    '/': () => searchRef.current?.focus(),
    'n': () => navigate('/sales/demands/new'),
  })

  return (
    <ListPageShell
      title="Оптовые отгрузки"
      description={data ? `${data.total.toLocaleString('ru')} документов` : 'Отгрузка товара юрлицу-контрагенту.'}
      actions={
        <>
          <SearchBar ref={searchRef} value={search} onChange={setSearch} placeholder="По номеру или контрагенту…" />
          <Link to="/sales/demands/new">
            <Button><Plus className="w-4 h-4" /> Новая отгрузка</Button>
          </Link>
        </>
      }
      footer={data && data.total > 0 && (
        <Pagination page={page} pageSize={data.pageSize} total={data.total} onPageChange={setPage} />
      )}
    >
      {!isLoading && (data?.items?.length ?? 0) === 0 && !search ? (
        <EmptyState
          icon={Truck}
          title="Оптовых отгрузок пока нет"
          description="Отгрузки оформляются для оптовых клиентов с оплатой постфактум или предоплатой."
          actionLabel="Создать отгрузку"
          onAction={() => navigate('/sales/demands/new')}
        />
      ) : (
        <DataTable
          rows={data?.items ?? []}
          isLoading={isLoading}
          rowKey={(r) => r.id}
          sortKey={sortKey}
          sortOrder={sortOrder}
          onSortChange={setSort}
          onRowClick={(r) => navigate(`/sales/demands/${r.id}`)}
          columns={[
            { header: '№', width: '160px', sortKey: 'number', cell: (r) => <span className="font-mono text-slate-600">{r.number}</span> },
            { header: 'Дата', width: '120px', sortKey: 'date', cell: (r) => new Date(r.date).toLocaleDateString('ru') },
            { header: 'Статус', width: '110px', sortKey: 'status', cell: (r) => (
              r.status === DemandStatus.Posted
                ? <span className="text-xs px-2 py-0.5 rounded bg-green-50 text-green-700">Проведён</span>
                : <span className="text-xs px-2 py-0.5 rounded bg-slate-100 text-slate-600">Черновик</span>
            )},
            { header: 'Контрагент', sortKey: 'customer', cell: (r) => r.customerName },
            { header: 'Склад', width: '160px', cell: (r) => r.storeName },
            { header: 'Оплата', width: '110px', cell: (r) => demandPaymentLabel[r.payment] ?? r.payment },
            { header: 'Позиций', width: '90px', className: 'text-right', cell: (r) => r.lineCount },
            { header: 'Сумма', width: '140px', className: 'text-right font-mono', sortKey: 'total', cell: (r) => `${r.total.toLocaleString('ru', moneyFmt)} ${r.currencyCode}` },
            { header: 'Оплачено', width: '140px', className: 'text-right font-mono text-slate-500', cell: (r) => r.paidAmount.toLocaleString('ru', moneyFmt) },
          ]}
          empty="Отгрузок пока нет. Создай первую — товар спишется со склада после проведения."
        />
      )}
    </ListPageShell>
  )
}
