import { fireEvent, render, screen, within } from '@testing-library/react'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import RightsDashboard from './RightsDashboard'

const mocks = vi.hoisted(() => ({ getDashboard: vi.fn() }))
vi.mock('../api/client', async (importOriginal) => ({
  ...(await importOriginal<typeof import('../api/client')>()),
  getDashboard: mocks.getDashboard,
}))

const data = {
  summary: { applied: 2, docSubmitted: 0, reviewTotal: 120, reviewDone: 90, processTotal: 40, processDone: 10, unresolvedRe: 0, reportWriting: 0, completed: 0 },
  orgs: [
    { id: 1, orgNo: '001', orgName: '완료기관', stage: 7, hasChannel: true, lawyerName: null, mjName: null, lawyerAssignedDate: null, reviewTotal: 90, reviewDone: 90, processTotal: 10, processDone: 10, stageChangedAt: null, lastChangedAt: null, reCount: 0 },
    { id: 2, orgNo: '002', orgName: '대기기관', stage: 5, hasChannel: true, lawyerName: null, mjName: null, lawyerAssignedDate: null, reviewTotal: 30, reviewDone: 0, processTotal: 30, processDone: 0, stageChangedAt: null, lastChangedAt: null, reCount: 0 },
  ],
}

describe('RightsDashboard', () => {
  beforeEach(() => mocks.getDashboard.mockResolvedValue(data))

  it('DB 집계 응답으로 권리확인 현황을 표시한다', async () => {
    render(<RightsDashboard mode="review" onOpenOrg={() => {}} />)
    expect(await screen.findByText('90 / 120')).toBeTruthy()
    expect(screen.getAllByText('75%')).toHaveLength(3)
    expect(screen.getByText('완료기관')).toBeTruthy()
  })

  it('기관 검색과 상태 필터가 동작한다', async () => {
    render(<RightsDashboard mode="process" onOpenOrg={() => {}} />)
    await screen.findByText('완료기관')
    fireEvent.change(screen.getByLabelText('기관명 검색'), { target: { value: '대기' } })
    expect(screen.queryByText('완료기관')).toBeNull()
    expect(screen.getByText('대기기관')).toBeTruthy()
    fireEvent.change(screen.getByLabelText('진행 상태'), { target: { value: 'complete' } })
    expect(screen.getByText('조건에 맞는 기관이 없습니다.')).toBeTruthy()
  })

  it('기관 행을 선택하면 상세 화면 콜백을 호출한다', async () => {
    const onOpenOrg = vi.fn()
    render(<RightsDashboard mode="review" onOpenOrg={onOpenOrg} />)
    const cell = await screen.findByText('완료기관')
    fireEvent.click(within(cell.closest('tr')!).getByText('완료기관'))
    expect(onOpenOrg).toHaveBeenCalledWith(1)
  })
})
