// T600.5 — TDD: TipoDeIvaFormModal
// CRÍTICO: verifica que el modal de Editar NO tiene campo Porcentaje [REQ-UI-003]
// 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 { TipoDeIvaFormModal } from '../../../../features/fiscal/iva/components/TipoDeIvaFormModal'
import type { TipoDeIva } from '../../../../features/fiscal/iva/types/tipoDeIva.types'

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

const sampleTipoDeIva: TipoDeIva = {
  id: 1,
  codigo: 'IVA_21',
  descripcion: 'IVA 21%',
  porcentaje: 21,
  vigenciaDesde: '2020-01-01',
  vigenciaHasta: null,
  activo: true,
  aplicaIVA: true,
  predecesorId: null,
}

function renderModal(
  opts: {
    item?: TipoDeIva | 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>
        <TipoDeIvaFormModal
          open={opts.open ?? true}
          item={opts.item ?? null}
          onClose={onClose}
          onSuccess={onSuccess}
        />
      </MemoryRouter>
    </QueryClientProvider>,
  )
  return { onClose, onSuccess }
}

describe('TipoDeIvaFormModal — CRÍTICO: sin campo Porcentaje en modo EDIT [REQ-UI-003]', () => {
  // El campo porcentaje NO debe aparecer en el modal de Editar
  // (los cambios de porcentaje van por NuevaVersion, no por Editar)
  it('NO renderiza campo porcentaje en modo edit', () => {
    renderModal({ item: sampleTipoDeIva })
    // queryByLabelText para "porcentaje" (sin "inicial") debe retornar null
    // En edit no hay campo porcentaje — solo en create aparece "Porcentaje inicial"
    expect(screen.queryByLabelText(/^porcentaje$/i)).toBeNull()
  })

  it('NO renderiza label exacto "Porcentaje" en modo edit (solo cosméticos)', () => {
    renderModal({ item: sampleTipoDeIva })
    // Verifica que no hay label con texto exacto "Porcentaje"
    expect(screen.queryByText(/^porcentaje$/i)).toBeNull()
  })

  it('muestra nota informativa sobre NuevaVersion en modo edit', () => {
    renderModal({ item: sampleTipoDeIva })
    expect(screen.getByText(/para cambiar el porcentaje/i)).toBeInTheDocument()
  })
})

describe('TipoDeIvaFormModal — campos presentes', () => {
  it('modo create: muestra campo Código', () => {
    renderModal({ item: null })
    expect(screen.getByLabelText(/código/i)).toBeInTheDocument()
  })

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

  it('modo edit: pre-rellena el formulario con datos del item', async () => {
    renderModal({ item: sampleTipoDeIva })

    await waitFor(() => {
      const codigoInput = screen.getByLabelText(/código/i) as HTMLInputElement
      expect(codigoInput.value).toBe('IVA_21')
    })
  })

  it('modo create: title es "Crear tipo de IVA"', () => {
    renderModal({ item: null })
    expect(
      screen.getByText(/crear tipo de iva/i),
    ).toBeInTheDocument()
  })

  it('modo edit: title es "Editar tipo de IVA"', () => {
    renderModal({ item: sampleTipoDeIva })
    expect(
      screen.getByText(/editar tipo de iva/i),
    ).toBeInTheDocument()
  })
})

describe('TipoDeIvaFormModal — validación', () => {
  it('muestra error si código está vacío al guardar', async () => {
    renderModal({ item: null })

    // Intenta guardar sin llenar código
    const saveBtn = screen.getByRole('button', { name: /guardar/i })
    await userEvent.click(saveBtn)

    await waitFor(() =>
      expect(screen.getByText(/código es requerido/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('TipoDeIvaFormModal — 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()
  })
})
