import { Head, router, usePage } from '@inertiajs/react'
import { FinanceAppLayout } from '@/layouts/finance-app-layout'
import { Button } from '@ui/components/ui/button'
import { Input } from '@ui/components/ui/input'
import { Badge } from '@ui/components/ui/badge'
import { Main } from '@ui/components/layout/main'
import { useMemo, useState } from 'react'

type MappingRow = {
  local: {
    id: number
    customer_code: string
    company_name: string
    accurate_id: number | null
    accurate_code: string | null
  }
  accurate: {
    id: number
    customer_no: string
    name: string
    source: 'linked' | 'suggested'
  } | null
  is_connected: boolean
}

type PageProps = {
  rows: {
    data: MappingRow[]
    current_page: number
    last_page: number
    per_page: number
    total: number
  }
  filters: {
    search: string
    per_page: number
  }
  accurate_configured: boolean
  [key: string]: unknown
}

const ROUTE = '/monitoring/integrasi-accurate/customer-mapping'
const CONNECT_ROUTE = '/monitoring/integrasi-accurate/customer-mapping/connect'

export default function CustomerMappingPage() {
  const { rows, filters, accurate_configured } = usePage<PageProps>().props
  const [search, setSearch] = useState(filters.search || '')
  const [loadingId, setLoadingId] = useState<number | null>(null)

  const hasRows = useMemo(() => rows.data.length > 0, [rows.data.length])

  const applySearch = () => {
    router.get(
      ROUTE,
      { search, page: 1, per_page: rows.per_page },
      { preserveState: true, preserveScroll: true, replace: true },
    )
  }

  const goPage = (page: number) => {
    router.get(
      ROUTE,
      { search: filters.search, page, per_page: rows.per_page },
      { preserveState: true, preserveScroll: true, replace: true },
    )
  }

  const connect = (row: MappingRow) => {
    if (!row.accurate || row.is_connected) return
    setLoadingId(row.local.id)
    router.post(
      CONNECT_ROUTE,
      {
        local_customer_id: row.local.id,
        accurate_customer_id: row.accurate.id,
        accurate_customer_no: row.accurate.customer_no,
        accurate_customer_name: row.accurate.name,
      },
      {
        preserveScroll: true,
        onFinish: () => setLoadingId(null),
      },
    )
  }

  return (
    <FinanceAppLayout>
      <Head title='Integrasi Customer Accurate' />
      <Main>
        <div className='mb-4 flex items-center justify-between gap-3'>
          <div>
            <h1 className='text-2xl font-bold tracking-tight'>Integrasi Customer</h1>
            <p className='text-sm text-muted-foreground'>
              Kiri: customer app gfin, kanan: customer Accurate.
            </p>
          </div>
          <div className='flex items-center gap-2'>
            <Input
              value={search}
              onChange={(e) => setSearch(e.target.value)}
              placeholder='Cari customer...'
              className='w-64'
            />
            <Button onClick={applySearch}>Cari</Button>
          </div>
        </div>

        {!accurate_configured && (
          <div className='mb-4 rounded-md border border-amber-300 bg-amber-50 px-3 py-2 text-sm text-amber-700'>
            Konfigurasi Accurate belum lengkap. Tombol Connect tidak akan aktif.
          </div>
        )}

        <div className='overflow-hidden rounded-lg border bg-white'>
          <div className='grid grid-cols-[1fr_auto_1fr] border-b bg-muted/40 px-4 py-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground'>
            <div>Customer App GFIN</div>
            <div className='px-4'>Relasi</div>
            <div>Customer Accurate</div>
          </div>

          {!hasRows && (
            <div className='px-4 py-8 text-sm text-muted-foreground'>Tidak ada data customer.</div>
          )}

          {rows.data.map((row) => (
            <div key={row.local.id} className='grid grid-cols-[1fr_auto_1fr] items-center border-b px-4 py-3 last:border-b-0'>
              <div>
                <p className='font-medium text-foreground'>{row.local.company_name}</p>
                <p className='text-xs text-muted-foreground'>{row.local.customer_code || '-'}</p>
              </div>

              <div className='px-4'>
                {row.is_connected ? (
                  <Badge variant='outline' className='font-mono'>=</Badge>
                ) : (
                  <Button
                    size='sm'
                    disabled={!accurate_configured || !row.accurate || loadingId === row.local.id}
                    onClick={() => connect(row)}
                  >
                    {loadingId === row.local.id ? 'Connecting...' : 'Connect'}
                  </Button>
                )}
              </div>

              <div>
                {row.accurate ? (
                  <>
                    <p className='font-medium text-foreground'>{row.accurate.name}</p>
                    <p className='text-xs text-muted-foreground font-mono'>
                      {row.accurate.customer_no || '-'} {row.accurate.source === 'suggested' ? '(suggested)' : ''}
                    </p>
                  </>
                ) : (
                  <p className='text-sm text-muted-foreground'>Tidak ada kandidat</p>
                )}
              </div>
            </div>
          ))}
        </div>

        <div className='mt-4 flex items-center justify-between text-sm text-muted-foreground'>
          <span>Total {rows.total} data</span>
          <div className='flex items-center gap-2'>
            <Button variant='outline' size='sm' disabled={rows.current_page <= 1} onClick={() => goPage(rows.current_page - 1)}>
              Prev
            </Button>
            <span>Page {rows.current_page} / {rows.last_page}</span>
            <Button variant='outline' size='sm' disabled={rows.current_page >= rows.last_page} onClick={() => goPage(rows.current_page + 1)}>
              Next
            </Button>
          </div>
        </div>
      </Main>
    </FinanceAppLayout>
  )
}

