import { describe, it, expect, beforeAll, afterAll, afterEach } from 'vitest'
import { http, HttpResponse } from 'msw'
import { setupServer } from 'msw/node'
import { getUserPermisos } from '../../../features/users/api/getUserPermisos'

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

const mockUsuarioPermisos = {
  rolPermisos: ['ventas:contado:crear', 'ventas:contado:cobrar'],
  overrides: {
    grant: ['textos:editar'],
    deny: ['ventas:contado:cobrar'],
  },
  effective: ['ventas:contado:crear', 'textos:editar'],
}

const server = setupServer()

beforeAll(() => server.listen({ onUnhandledRequest: 'error' }))
afterEach(() => server.resetHandlers())
afterAll(() => server.close())

describe('getUserPermisos api client', () => {
  it('calls GET /api/v1/users/:id/permisos and returns UsuarioPermisos shape', async () => {
    server.use(
      http.get(`${API_URL}/api/v1/users/42/permisos`, () =>
        HttpResponse.json(mockUsuarioPermisos),
      ),
    )

    const result = await getUserPermisos(42)

    expect(result.rolPermisos).toEqual(['ventas:contado:crear', 'ventas:contado:cobrar'])
    expect(result.overrides.grant).toEqual(['textos:editar'])
    expect(result.overrides.deny).toEqual(['ventas:contado:cobrar'])
    expect(result.effective).toEqual(['ventas:contado:crear', 'textos:editar'])
  })

  it('rejects with error on 404', async () => {
    server.use(
      http.get(`${API_URL}/api/v1/users/9999/permisos`, () =>
        HttpResponse.json({ title: 'Not Found', status: 404 }, { status: 404 }),
      ),
    )

    await expect(getUserPermisos(9999)).rejects.toThrow()
  })
})
