// T600.20-T600.29 (IIBB) — TDD: TiposDeIibbPage
// Tests: banner + tabla + modales
import { describe, it, expect, beforeAll, afterAll, afterEach, vi } from 'vitest'
import { render, screen, waitFor } from '@testing-library/react'
import { http, HttpResponse } from 'msw'
import { setupServer } from 'msw/node'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { MemoryRouter, Routes, Route } from 'react-router-dom'
import { TooltipProvider } from '@/components/ui/tooltip'
import { TiposDeIibbPage } from '../../../../features/fiscal/iibb/pages/TiposDeIibbPage'
import { useAuthStore } from '../../../../stores/authStore'

vi.mock('sonner', () => ({
  toast: { success: vi.fn(), error: vi.fn() },
  Toaster: () => null,
}))

const API_URL = 'http://localhost:5000'

const adminUser = {
  id: 1,
  username: 'admin',
  nombre: 'Admin',
  rol: 'admin',
  permisos: ['administracion:fiscal:gestionar'],
  mustChangePassword: false,
}

function makeIibbItems() {
  return [
    {
      id: 1,
      provincia: 'Cordoba',
      provinciaDisplay: 'Córdoba',
      descripcion: 'IIBB Córdoba',
      alicuota: 2.5,
      vigenciaDesde: '2020-01-01',
      vigenciaHasta: null,
      activo: true,
      predecesorId: null,
    },
    {
      id: 2,
      provincia: 'BuenosAires',
      provinciaDisplay: 'Buenos Aires',
      descripcion: 'IIBB Buenos Aires',
      alicuota: 3.0,
      vigenciaDesde: '2020-01-01',
      vigenciaHasta: null,
      activo: true,
      predecesorId: null,
    },
  ]
}

const server = setupServer()

beforeAll(() => server.listen({ onUnhandledRequest: 'warn' }))
afterEach(() => {
  server.resetHandlers()
  useAuthStore.getState().clearAuth()
  vi.clearAllMocks()
})
afterAll(() => server.close())

function renderPage(user = adminUser) {
  useAuthStore.setState({ user })
  const qc = new QueryClient({
    defaultOptions: { queries: { retry: false }, mutations: { retry: false } },
  })

  server.use(
    http.get(`${API_URL}/api/v1/admin/fiscal/iibb`, () =>
      HttpResponse.json({
        items: makeIibbItems(),
        page: 1,
        pageSize: 20,
        total: 2,
      }),
    ),
  )

  render(
    <QueryClientProvider client={qc}>
      <MemoryRouter initialEntries={['/admin/fiscal/iibb']}>
        <TooltipProvider>
          <Routes>
            <Route path="/admin/fiscal/iibb" element={<TiposDeIibbPage />} />
          </Routes>
        </TooltipProvider>
      </MemoryRouter>
    </QueryClientProvider>,
  )
}

describe('TiposDeIibbPage — banner visible al montar', () => {
  it('muestra el banner de advertencia inmediatamente', () => {
    renderPage()
    expect(
      screen.getByText(/cambios de alícuota afectan presupuestos/i),
    ).toBeInTheDocument()
  })
})

describe('TiposDeIibbPage — tabla y contenido', () => {
  it('muestra título "Ingresos Brutos"', () => {
    renderPage()
    expect(screen.getByText('Ingresos Brutos')).toBeInTheDocument()
  })

  it('muestra botón "Crear nuevo"', () => {
    renderPage()
    expect(screen.getByRole('button', { name: /crear nuevo/i })).toBeInTheDocument()
  })

  it('renderiza filas con provincias al cargar datos', async () => {
    renderPage()
    await waitFor(() =>
      expect(screen.getByText('Córdoba')).toBeInTheDocument(),
    )
    expect(screen.getByText('Buenos Aires')).toBeInTheDocument()
  })
})
