'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 } from 'lucide-react'
import { toast } from 'sonner'
import { api, type PaginatedResponse, type Contract } 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'

const statusVariant = (status: string) => {
  if (status === 'active') return 'success'
  if (status === 'expired' || status === 'terminated') return 'danger'
  if (status === 'draft') return 'muted'
  return 'warning'
}

export function ContractsPage() {
  const { t } = useTranslation()
  const queryClient = useQueryClient()
  const [search, setSearch] = useState('')
  const [status, setStatus] = useState('')
  const [page, setPage] = useState(1)

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

  const remove = useMutation({
    mutationFn: (id: number) => api.delete(`/contracts/${id}`),
    onSuccess: () => {
      toast.success(t('contracts.messages.deleted'))
      queryClient.invalidateQueries({ queryKey: ['contracts'] })
    },
    onError: () => toast.error(t('common.somethingWentWrong')),
  })

  const amend = useMutation({
    mutationFn: (id: number) => api.post(`/contracts/${id}/amendments`),
    onSuccess: () => {
      toast.success(t('contracts.messages.amended'))
      queryClient.invalidateQueries({ queryKey: ['contracts'] })
    },
    onError: () => toast.error(t('common.somethingWentWrong')),
  })

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

  const statusOptions = [
    { value: '', label: t('common.allStatuses') },
    ...(['draft', 'active', 'expired', 'terminated'] as const).map((value) => ({
      value,
      label: t(`contracts.status.${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" data-tour="page-heading">{t('contracts.title')}</h1>
        <Link href="/contracts/new" data-tour="create-button">
          <Button size="sm">
            <Plus size={14} />
            {t('contracts.create')}
          </Button>
        </Link>
      </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('contracts.search')}
          toolbar={
            <Select
              value={status}
              onChange={(e) => {
                setStatus(e.target.value)
                setPage(1)
              }}
              options={statusOptions}
            />
          }
          pagination={meta}
          onPageChange={setPage}
          columns={[
            {
              key: 'contract_number',
              header: t('common.code'),
              className: 'font-mono text-xs',
            },
            { key: 'title', header: t('contracts.titleField') },
            {
              key: 'project',
              header: t('contracts.project'),
              render: (r) => r.project?.name || '—',
            },
            {
              key: 'contract_type',
              header: t('contracts.type'),
              render: (r) => t(`contracts.type_options.${r.contract_type}`, r.contract_type),
            },
            {
              key: 'status',
              header: t('common.status'),
              render: (r) => (
                <Badge variant={statusVariant(r.status)}>
                  {t(`contracts.status.${r.status}`, r.status)}
                </Badge>
              ),
            },
            {
              key: 'total_value',
              header: t('contracts.totalValue'),
              render: (r) =>
                r.total_value != null
                  ? `${Number(r.total_value).toLocaleString()} ${r.currency}`
                  : '—',
            },
            {
              key: 'actions',
              header: t('common.actions'),
              className: 'text-right',
              render: (r) => (
                <div className="flex justify-end gap-2">
                  <button
                    type="button"
                    onClick={() => amend.mutate(r.id)}
                    className="rounded-lg px-2 py-1 text-xs font-semibold text-[var(--premium-muted-text)] hover:bg-[var(--premium-hover-bg)]"
                  >
                    {t('contracts.amend')}
                  </button>
                  <Link
                    href={`/contracts/${r.id}/edit`}
                    className="rounded-lg px-2 py-1 text-xs font-semibold text-accent-600 hover:bg-[var(--premium-hover-bg)]"
                  >
                    {t('common.edit')}
                  </Link>
                  <button
                    type="button"
                    onClick={() => {
                      if (window.confirm(t('common.confirmDelete'))) remove.mutate(r.id)
                    }}
                    className="rounded-lg px-2 py-1 text-xs font-semibold text-red-500 hover:bg-red-500/10"
                  >
                    {t('common.delete')}
                  </button>
                </div>
              ),
            },
          ]}
        />
      </div>
    </div>
  )
}
