// T600.20-T600.29 (IIBB) — TDD: IngresosBrutosFormModal
// CRÍTICO: verifica que el modal de Editar NO tiene campo Alícuota [REQ-UI-007]
// T600.10 — BUG-FE-03 regression: default vigenciaDesde usa todayArgentina (no UTC)
import { describe, it, expect, vi } from 'vitest'
import { render, screen, waitFor } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { MemoryRouter } from 'react-router-dom'
import { IngresosBrutosFormModal } from '../../../../features/fiscal/iibb/components/IngresosBrutosFormModal'
import type { IngresosBrutos } from '../../../../features/fiscal/iibb/types/ingresosBrutos.types'

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

const sampleIibb: IngresosBrutos = {
  id: 1,
  provincia: 'Cordoba',
  provinciaDisplay: 'Córdoba',
  descripcion: 'IIBB Córdoba',
  alicuota: 2.5,
  vigenciaDesde: '2020-01-01',
  vigenciaHasta: null,
  activo: true,
  predecesorId: null,
}

function renderModal(opts: {
  item?: IngresosBrutos | null
  open?: boolean
  onClose?: () => void
  onSuccess?: () => void
} = {}) {
  const qc = new QueryClient({
    defaultOptions: { queries: { retry: false }, mutations: { retry: false } },
  })
  const onClose = opts.onClose ?? vi.fn()
  const onSuccess = opts.onSuccess ?? vi.fn()

  render(
    <QueryClientProvider client={qc}>
      <MemoryRouter>
        <IngresosBrutosFormModal
          open={opts.open ?? true}
          item={opts.item ?? null}
          onClose={onClose}
          onSuccess={onSuccess}
        />
      </MemoryRouter>
    </QueryClientProvider>,
  )
  return { onClose, onSuccess }
}

describe('IngresosBrutosFormModal — CRÍTICO: sin campo Alícuota en modo EDIT [REQ-UI-007]', () => {
  it('NO renderiza label exacto "Alícuota" en modo edit', () => {
    renderModal({ item: sampleIibb })
    expect(screen.queryByText(/^alícuota$/i)).toBeNull()
  })

  it('muestra nota informativa sobre NuevaVersion en modo edit', () => {
    renderModal({ item: sampleIibb })
    expect(screen.getByText(/para cambiar la alícuota/i)).toBeInTheDocument()
  })

  it('modo edit: muestra campo Descripción', () => {
    renderModal({ item: sampleIibb })
    expect(screen.getByLabelText(/descripción/i)).toBeInTheDocument()
  })

  it('modo edit: pre-rellena con la descripción del item', async () => {
    renderModal({ item: sampleIibb })
    await waitFor(() => {
      const desc = screen.getByLabelText(/descripción/i) as HTMLInputElement
      expect(desc.value).toBe('IIBB Córdoba')
    })
  })

  it('modo edit: title es "Editar Ingresos Brutos"', () => {
    renderModal({ item: sampleIibb })
    expect(screen.getByText(/editar ingresos brutos/i)).toBeInTheDocument()
  })

  it('modo create: title es "Crear Ingresos Brutos"', () => {
    renderModal({ item: null })
    expect(screen.getByText(/crear ingresos brutos/i)).toBeInTheDocument()
  })

  it('botón Cancelar llama onClose', async () => {
    const { onClose } = renderModal({ item: null })
    await userEvent.click(screen.getByRole('button', { name: /cancelar/i }))
    expect(onClose).toHaveBeenCalledTimes(1)
  })
})

describe('IngresosBrutosFormModal — BUG-FE-03 regression: vigenciaDesde usa todayArgentina', () => {
  // A las 22:30 ART del 30/04, UTC ya es 01:30 del 01/05.
  // new Date().toISOString().slice(0,10) devolvería "2026-05-01" (UTC) — INCORRECTO.
  // todayArgentina() debe devolver "2026-04-30" — CORRECTO.
  it('modo create: campo vigenciaDesde refleja fecha ART, no UTC, a las 22:30 ART del 30/04', () => {
    vi.useFakeTimers()
    vi.setSystemTime(new Date('2026-05-01T01:30:00.000Z'))  // 22:30 ART del 30/04

    renderModal({ item: null })

    const vigenciaInput = screen.getByLabelText(/vigencia desde/i) as HTMLInputElement
    // El input debe tener value="2026-04-30" (fecha ART), no "2026-05-01" (UTC)
    expect(vigenciaInput.value).toBe('2026-04-30')

    vi.useRealTimers()
  })
})
