'use client'

import { useState } from 'react'
import Link from 'next/link'
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import { useTranslation } from 'react-i18next'
import { Plus, Download } from 'lucide-react'
import { toast } from 'sonner'
import { api, type PaginatedResponse, type Partner } from '@/lib/api'
import { DataTable, type BulkAction } from '@/components/DataTable'
import { Button } from '@/components/ui/Button'
import { Badge } from '@/components/ui/Badge'
import { Select } from '@/components/ui/Select'

const statusVariant = (status: string) => {
  if (status === 'active') return 'success'
  if (status === 'blacklisted' || status === 'suspended') return 'danger'
  if (status === 'prospect') return 'warning'
  return 'muted'
}

export function PartnersPage() {
  const { t } = useTranslation()
  const queryClient = useQueryClient()
  const [search, setSearch] = useState('')
  const [status, setStatus] = useState('')
  const [page, setPage] = useState(1)
  const [perPage, setPerPage] = useState<number | 'all'>(25)
  const [selected, setSelected] = useState<number[]>([])
  const [exporting, setExporting] = useState(false)

  const { data, isLoading } = useQuery({
    queryKey: ['partners', search, status, page, perPage],
    queryFn: () =>
      api.get<PaginatedResponse<Partner>>('/partners', {
        params: {
          search: search || undefined,
          status: status || undefined,
          page,
          per_page: perPage === 'all' ? 'all' : perPage,
        },
      }),
  })

  const bulkDisable = useMutation({
    mutationFn: (ids: number[]) => api.post('/partners/bulk-disable', { ids }),
    onSuccess: (_, ids) => {
      toast.success(t('partners.messages.disableSuccess', { count: ids.length }))
      setSelected([])
      queryClient.invalidateQueries({ queryKey: ['partners'] })
    },
    onError: () => toast.error(t('partners.messages.disableFailed')),
  })

  const bulkDelete = useMutation({
    mutationFn: (ids: number[]) => api.delete('/partners/bulk-delete', { data: { ids } }),
    onSuccess: (_, ids) => {
      toast.success(t('partners.messages.deleteSuccess', { count: ids.length }))
      setSelected([])
      queryClient.invalidateQueries({ queryKey: ['partners'] })
    },
    onError: () => toast.error(t('partners.messages.deleteFailed')),
  })

  const handleExport = async () => {
    setExporting(true)
    try {
      const res = await api.get('/partners/export', {
        params: { search: search || undefined, status: status || undefined },
        responseType: 'blob',
      })
      const url = window.URL.createObjectURL(new Blob([res.data as BlobPart]))
      const a = document.createElement('a')
      a.href = url
      a.download = `partners_${new Date().toISOString().slice(0, 10)}.csv`
      a.click()
      window.URL.revokeObjectURL(url)
      toast.success(t('partners.messages.exportSuccess'))
    } catch {
      toast.error(t('partners.messages.exportFailed'))
    } finally {
      setExporting(false)
    }
  }

  const handleImport = async (csv: string) => {
    try {
      const res = await api.post<{ data: { created: number } }>('/partners/import', { csv })
      toast.success(t('partners.messages.importSuccess', { count: res.data.data.created }))
      queryClient.invalidateQueries({ queryKey: ['partners'] })
    } catch {
      toast.error(t('partners.messages.importFailed'))
    }
  }

  const handleDuplicate = async (id: number) => {
    try {
      await api.post(`/partners/${id}/duplicate`)
      toast.success(t('partners.messages.duplicateSuccess'))
      queryClient.invalidateQueries({ queryKey: ['partners'] })
    } catch {
      toast.error(t('partners.messages.duplicateFailed'))
    }
  }

  const partners = data?.data.data ?? []
  const meta = data?.data.meta

  const statusOptions = [
    { value: '', label: t('common.allStatuses') },
    ...(['active', 'inactive', 'prospect', 'blacklisted', 'suspended'] as const).map((value) => ({
      value,
      label: t(`partners.status.${value}`),
    })),
  ]

  const bulkActions: BulkAction[] = [
    { label: t('common.disable'), variant: 'warning', onClick: (ids) => bulkDisable.mutate(ids) },
    {
      label: t('common.delete'),
      variant: 'danger',
      onClick: (ids) => {
        if (window.confirm(t('partners.messages.deleteConfirm', { count: ids.length }))) {
          bulkDelete.mutate(ids)
        }
      },
    },
  ]

  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">{t('partners.title')}</h1>
        <div className="flex items-center gap-2">
          <Button
            variant="secondary"
            size="sm"
            onClick={handleExport}
            disabled={exporting}
          >
            <Download size={14} />
            {exporting ? t('common.exporting') : t('common.exportCsv')}
          </Button>
          <Link href="/partners/new">
            <Button size="sm">
              <Plus size={14} />
              {t('partners.create')}
            </Button>
          </Link>
        </div>
      </div>

      <div className="animate-fade-in-up stagger-1">
        <DataTable
          data={partners}
          loading={isLoading}
          selected={selected}
          onSelect={setSelected}
          bulkActions={bulkActions}
          emptyMessage={t('common.noResults')}
          onSearch={(q) => { setSearch(q); setPage(1) }}
          searchValue={search}
          searchPlaceholder={t('common.searchPartners')}
          toolbar={
            <Select
              value={status}
              onChange={(e) => { setStatus(e.target.value); setPage(1) }}
              options={statusOptions}
            />
          }
          pagination={meta}
          onPageChange={setPage}
          perPage={typeof perPage === 'number' ? perPage : undefined}
          onPerPageChange={(n) => {
            setPerPage(n)
            setPage(1)
          }}
          onImportFile={handleImport}
          onDuplicate={handleDuplicate}
          columns={[
            { key: 'client_code', header: t('common.code'), className: 'font-mono text-xs', sortable: true },
            { key: 'name', header: t('partners.name'), sortable: true },
            { key: 'vat_number', header: t('partners.vatNumber'), render: (r) => r.vat_number || '—' },
            {
              key: 'partner_type',
              header: t('partners.type'),
              render: (r) => (
                <span>{t(`partners.type_options.${r.partner_type}`, r.partner_type)}</span>
              ),
            },
            {
              key: 'status',
              header: t('common.status'),
              render: (r) => (
                <Badge variant={statusVariant(r.status)}>
                  {t(`partners.status.${r.status}`, r.status)}
                </Badge>
              ),
            },
            { key: 'city', header: t('partners.city'), render: (r) => r.city || '—' },
            {
              key: 'actions',
              header: t('common.actions'),
              className: 'text-right',
              render: (r) => (
                <div className="flex justify-end gap-2">
                  <button
                    type="button"
                    onClick={() => handleDuplicate(r.id)}
                    className="rounded-lg px-2 py-1 text-xs font-semibold text-[var(--premium-muted-text)] hover:bg-[var(--premium-hover-bg)]"
                  >
                    Duplicate
                  </button>
                  <Link
                    href={`/partners/${r.id}/edit`}
                    className="rounded-lg px-2 py-1 text-xs font-semibold text-accent-600 transition-colors hover:bg-[var(--premium-hover-bg)] hover:text-accent-500 dark:text-accent-400 dark:hover:text-accent-300"
                  >
                    {t('common.edit')}
                  </Link>
                </div>
              ),
            },
          ]}
        />
      </div>
    </div>
  )
}
