'use client'

import { useState } from 'react'
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import { useTranslation } from 'react-i18next'
import { Plus, Trash2 } from 'lucide-react'
import { toast } from 'sonner'
import { api, type PaginatedResponse, type Warehouse } from '@/lib/api'
import { DataTable } from '@/components/DataTable'
import { Button } from '@/components/ui/Button'
import { Badge } from '@/components/ui/Badge'
import { Input } from '@/components/ui/Input'
import { Select } from '@/components/ui/Select'
import { PermissionGate } from '@/components/auth/PermissionGate'

const emptyForm = {
  name: '',
  code: '',
  type: 'static',
  allow_negative: false,
}

export function WarehousesPage() {
  const { t } = useTranslation()
  const queryClient = useQueryClient()
  const [search, setSearch] = useState('')
  const [type, setType] = useState('')
  const [page, setPage] = useState(1)
  const [showForm, setShowForm] = useState(false)
  const [form, setForm] = useState(emptyForm)

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

  const create = useMutation({
    mutationFn: () => api.post('/inventory/warehouses', form),
    onSuccess: () => {
      toast.success(t('inventory.messages.warehouseCreated'))
      setForm(emptyForm)
      setShowForm(false)
      queryClient.invalidateQueries({ queryKey: ['warehouses'] })
    },
    onError: () => toast.error(t('common.somethingWentWrong')),
  })

  const remove = useMutation({
    mutationFn: (id: number) => api.delete(`/inventory/warehouses/${id}`),
    onSuccess: () => {
      toast.success(t('inventory.messages.warehouseDeleted'))
      queryClient.invalidateQueries({ queryKey: ['warehouses'] })
    },
    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">
        <h1 className="premium-heading text-2xl font-bold">{t('inventory.warehousesTitle')}</h1>
        <PermissionGate permission="inventory.manage">
          <Button size="sm" onClick={() => setShowForm((v) => !v)}>
            <Plus size={14} />
            {t('inventory.createWarehouse')}
          </Button>
        </PermissionGate>
      </div>

      {showForm && (
        <form
          className="premium-card animate-fade-in-up grid gap-3 rounded-2xl p-4 md:grid-cols-3"
          onSubmit={(e) => {
            e.preventDefault()
            create.mutate()
          }}
        >
          <Input
            label={t('inventory.name')}
            value={form.name}
            onChange={(e) => setForm((f) => ({ ...f, name: e.target.value }))}
            required
          />
          <Input
            label={t('inventory.code')}
            value={form.code}
            onChange={(e) => setForm((f) => ({ ...f, code: e.target.value }))}
            placeholder="WH-001"
          />
          <Select
            label={t('inventory.type')}
            value={form.type}
            onChange={(e) => setForm((f) => ({ ...f, type: e.target.value }))}
            options={[
              { value: 'static', label: t('inventory.type_options.static') },
              { value: 'project', label: t('inventory.type_options.project') },
            ]}
          />
          <label className="flex items-center gap-2 text-sm text-[var(--premium-muted-text)]">
            <input
              type="checkbox"
              checked={form.allow_negative}
              onChange={(e) => setForm((f) => ({ ...f, allow_negative: e.target.checked }))}
            />
            {t('inventory.allowNegative')}
          </label>
          <div className="flex items-end gap-2 md:col-span-2">
            <Button type="submit" size="sm" disabled={create.isPending}>
              {create.isPending ? t('common.saving') : t('common.save')}
            </Button>
            <Button type="button" size="sm" variant="secondary" onClick={() => setShowForm(false)}>
              {t('common.cancel')}
            </Button>
          </div>
        </form>
      )}

      <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('inventory.searchWarehouses')}
          toolbar={
            <Select
              value={type}
              onChange={(e) => {
                setType(e.target.value)
                setPage(1)
              }}
              options={[
                { value: '', label: t('common.allStatuses') },
                { value: 'static', label: t('inventory.type_options.static') },
                { value: 'project', label: t('inventory.type_options.project') },
              ]}
            />
          }
          pagination={meta}
          onPageChange={setPage}
          columns={[
            { key: 'code', header: t('common.code'), className: 'font-mono text-xs' },
            { key: 'name', header: t('inventory.name') },
            {
              key: 'type',
              header: t('inventory.type'),
              render: (r) => (
                <Badge variant={r.type === 'project' ? 'warning' : 'muted'}>
                  {t(`inventory.type_options.${r.type}`, r.type)}
                </Badge>
              ),
            },
            {
              key: 'allow_negative',
              header: t('inventory.allowNegative'),
              render: (r) => (r.allow_negative ? t('common.yes') : t('common.no')),
            },
            {
              key: 'project',
              header: t('inventory.project'),
              render: (r) => r.project?.name || '—',
            },
            {
              key: 'actions',
              header: t('common.actions'),
              render: (r) => (
                <PermissionGate permission="inventory.manage">
                  <button
                    type="button"
                    className="rounded-lg p-1.5 text-red-400 hover:bg-red-500/10"
                    onClick={() => {
                      if (window.confirm(t('common.confirmDelete'))) remove.mutate(r.id)
                    }}
                  >
                    <Trash2 size={14} />
                  </button>
                </PermissionGate>
              ),
            },
          ]}
        />
      </div>
    </div>
  )
}
