'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 { ArrowLeft } from 'lucide-react'
import { toast } from 'sonner'
import { api, type PaginatedResponse, type Issue } from '@/lib/api'
import { DataTable } from '@/components/DataTable'
import { Badge } from '@/components/ui/Badge'
import { Select } from '@/components/ui/Select'
import { Input } from '@/components/ui/Input'
import { Button } from '@/components/ui/Button'

export function IssuesPage() {
  const { t } = useTranslation()
  const queryClient = useQueryClient()
  const [search, setSearch] = useState('')
  const [status, setStatus] = useState('')
  const [page, setPage] = useState(1)
  const [actionDesc, setActionDesc] = useState<Record<number, string>>({})

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

  const addAction = useMutation({
    mutationFn: ({ issueId, description }: { issueId: number; description: string }) =>
      api.post(`/issues/${issueId}/corrective-actions`, { description }),
    onSuccess: () => {
      toast.success(t('inspections.messages.actionAdded'))
      queryClient.invalidateQueries({ queryKey: ['issues'] })
    },
    onError: () => toast.error(t('common.somethingWentWrong')),
  })

  const updateStatus = useMutation({
    mutationFn: ({ id, status: next }: { id: number; status: string }) =>
      api.put(`/issues/${id}`, { status: next }),
    onSuccess: () => {
      toast.success(t('inspections.messages.statusUpdated'))
      queryClient.invalidateQueries({ queryKey: ['issues'] })
    },
    onError: () => toast.error(t('common.somethingWentWrong')),
  })

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

  return (
    <div className="space-y-5">
      <div className="animate-fade-in-up flex flex-wrap items-center justify-between gap-3">
        <div className="flex items-center gap-3">
          <Link href="/inspections">
            <button
              type="button"
              className="premium-chip press-btn flex items-center gap-1.5 rounded-xl px-3 py-2 text-sm"
            >
              <ArrowLeft size={15} />
              {t('common.back')}
            </button>
          </Link>
          <h1 className="premium-heading text-2xl font-bold">{t('inspections.issues')}</h1>
        </div>
      </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('inspections.searchIssues')}
          toolbar={
            <Select
              value={status}
              onChange={(e) => {
                setStatus(e.target.value)
                setPage(1)
              }}
              options={[
                { value: '', label: t('common.allStatuses') },
                ...(['open', 'in_progress', 'resolved', 'closed'] as const).map((value) => ({
                  value,
                  label: t(`inspections.issueStatus.${value}`),
                })),
              ]}
            />
          }
          pagination={meta}
          onPageChange={setPage}
          columns={[
            { key: 'issue_number', header: t('common.code'), className: 'font-mono text-xs' },
            { key: 'title', header: t('inspections.issueTitle') },
            {
              key: 'project',
              header: t('inspections.project'),
              render: (r) => r.project?.name || '—',
            },
            {
              key: 'status',
              header: t('common.status'),
              render: (r) => (
                <Select
                  value={r.status}
                  onChange={(e) => updateStatus.mutate({ id: r.id, status: e.target.value })}
                  options={(['open', 'in_progress', 'resolved', 'closed'] as const).map(
                    (value) => ({
                      value,
                      label: t(`inspections.issueStatus.${value}`),
                    }),
                  )}
                />
              ),
            },
            {
              key: 'severity',
              header: t('inspections.severity'),
              render: (r) => r.severity || '—',
            },
            {
              key: 'actions',
              header: t('inspections.correctiveActions'),
              render: (r) => (
                <div className="space-y-2 min-w-[220px]">
                  {(r.actions ?? []).map((a) => (
                    <div key={a.id} className="text-xs text-[var(--text-muted)]">
                      • {a.description}
                    </div>
                  ))}
                  <div className="flex gap-1">
                    <Input
                      value={actionDesc[r.id] ?? ''}
                      onChange={(e) =>
                        setActionDesc((prev) => ({ ...prev, [r.id]: e.target.value }))
                      }
                      placeholder={t('inspections.actionPlaceholder')}
                    />
                    <Button
                      size="sm"
                      variant="secondary"
                      disabled={!actionDesc[r.id]?.trim()}
                      onClick={() => {
                        addAction.mutate({
                          issueId: r.id,
                          description: actionDesc[r.id],
                        })
                        setActionDesc((prev) => ({ ...prev, [r.id]: '' }))
                      }}
                    >
                      +
                    </Button>
                  </div>
                </div>
              ),
            },
          ]}
        />
      </div>
    </div>
  )
}
