'use client'

import { useState } from 'react'
import Link from 'next/link'
import { useQuery } from '@tanstack/react-query'
import { useTranslation } from 'react-i18next'
import { Plus } from 'lucide-react'
import { api, type PaginatedResponse, type Invoice } from '@/lib/api'
import { DataTable } from '@/components/DataTable'
import { Button } from '@/components/ui/Button'
import { Badge } from '@/components/ui/Badge'
import { Select } from '@/components/ui/Select'
import { PermissionGate } from '@/components/auth/PermissionGate'

const statusVariant = (status: string) => {
  if (status === 'paid' || status === 'issued') return 'success'
  if (status === 'cancelled') return 'danger'
  if (status === 'partially_paid') return 'warning'
  return 'muted'
}

export function InvoicesPage({ invoiceType = 'sales' }: { invoiceType?: 'sales' | 'purchase' }) {
  const { t } = useTranslation()
  const [search, setSearch] = useState('')
  const [status, setStatus] = useState('')
  const [page, setPage] = useState(1)

  const { data, isLoading } = useQuery({
    queryKey: ['invoices', invoiceType, search, status, page],
    queryFn: () =>
      api.get<PaginatedResponse<Invoice>>('/invoices', {
        params: {
          search: search || undefined,
          status: status || undefined,
          invoice_type: invoiceType,
          page,
          per_page: 25,
        },
      }),
  })

  const rows = data?.data.data ?? []
  const meta = data?.data.meta
  const basePath = invoiceType === 'purchase' ? '/finance/purchases' : '/finance/invoices'
  const isPurchase = invoiceType === 'purchase'

  const statusOptions = [
    { value: '', label: t('common.allStatuses') },
    ...(isPurchase
      ? ['draft', 'submitted', 'approved', 'grn_created', 'partially_paid', 'paid', 'cancelled']
      : ['draft', 'issued', 'partially_paid', 'paid', 'cancelled']
    ).map((value) => ({
      value,
      label: t(`finance.status.${value}`, value),
    })),
  ]

  return (
    <div className="space-y-5">
      <div className="animate-fade-in-up flex flex-wrap items-center justify-between gap-3">
        <h1 className="premium-heading text-2xl font-bold">
          {isPurchase ? t('finance.purchases') : t('finance.invoices')}
        </h1>
        <PermissionGate permission={isPurchase ? 'purchasing.manage' : 'finance.manage'}>
          <Link href={`${basePath === '/finance/purchases' ? '/finance/invoices/new?type=purchase' : '/finance/invoices/new'}`}>
            <Button size="sm">
              <Plus size={14} />
              {t('common.create')}
            </Button>
          </Link>
        </PermissionGate>
      </div>

      <div className="animate-fade-in-up stagger-1">
        <DataTable
          data={rows}
          loading={isLoading}
          emptyMessage={t('common.noResults')}
          onSearch={(q) => {
            setSearch(q)
            setPage(1)
          }}
          searchValue={search}
          searchPlaceholder={t('finance.searchInvoices')}
          toolbar={
            <Select
              value={status}
              onChange={(e) => {
                setStatus(e.target.value)
                setPage(1)
              }}
              options={statusOptions}
            />
          }
          pagination={meta}
          onPageChange={setPage}
          columns={[
            {
              key: 'invoice_number',
              header: t('common.code'),
              className: 'font-mono text-xs',
              render: (r) => (
                <Link href={`/finance/invoices/${r.id}`} className="text-brand-700 hover:underline">
                  {r.invoice_number}
                </Link>
              ),
            },
            {
              key: 'partner',
              header: t('finance.partner'),
              render: (r) => r.partner?.name || '—',
            },
            {
              key: 'status',
              header: t('common.status'),
              render: (r) => (
                <div className="flex items-center gap-2">
                  <Badge variant={statusVariant(r.status)}>
                    {t(`finance.status.${r.status}`, r.status)}
                  </Badge>
                  {r.has_price_alerts && (
                    <Badge variant="danger">{t('finance.priceAlert')}</Badge>
                  )}
                </div>
              ),
            },
            {
              key: 'total',
              header: t('finance.total'),
              render: (r) => `${Number(r.total).toFixed(2)} ${r.currency}`,
            },
            {
              key: 'amount_paid',
              header: t('finance.paid'),
              render: (r) => Number(r.amount_paid).toFixed(2),
            },
            {
              key: 'issue_date',
              header: t('finance.issueDate'),
              render: (r) => (r.issue_date ? String(r.issue_date).slice(0, 10) : '—'),
            },
          ]}
        />
      </div>
    </div>
  )
}
