import { describe, it, expect, beforeEach } from 'vitest'
import { render, screen } from '@testing-library/react'
import { useAuthStore } from '../../../stores/authStore'
import { CanPerform } from '../../../components/auth/CanPerform'

beforeEach(() => {
  useAuthStore.setState({ user: null, accessToken: null, refreshToken: null, expiresAt: null })
})

describe('CanPerform', () => {
  it('F-02-01: usuario con permiso → renderiza children', () => {
    useAuthStore.setState({
      user: {
        id: 1,
        username: 'admin',
        nombre: 'Admin',
        rol: 'admin',
        permisos: ['administracion:usuarios:gestionar'],
        mustChangePassword: false,
      },
    })

    render(
      <CanPerform permission="administracion:usuarios:gestionar">
        <span>Acción</span>
      </CanPerform>,
    )

    expect(screen.getByText('Acción')).toBeInTheDocument()
  })

  it('F-02-02: usuario sin permiso → no renderiza children (null)', () => {
    useAuthStore.setState({
      user: {
        id: 2,
        username: 'cajero',
        nombre: 'Cajero',
        rol: 'cajero',
        permisos: ['ventas:contado:crear'],
        mustChangePassword: false,
      },
    })

    render(
      <CanPerform permission="administracion:usuarios:gestionar">
        <span>Acción</span>
      </CanPerform>,
    )

    expect(screen.queryByText('Acción')).not.toBeInTheDocument()
  })

  it('F-02-03: sin user → no renderiza children', () => {
    useAuthStore.setState({ user: null })

    render(
      <CanPerform permission="administracion:usuarios:gestionar">
        <span>Acción</span>
      </CanPerform>,
    )

    expect(screen.queryByText('Acción')).not.toBeInTheDocument()
  })

  it('F-02-04: sin permiso pero con fallback → renderiza fallback, NO children', () => {
    useAuthStore.setState({
      user: {
        id: 3,
        username: 'reportes',
        nombre: 'Reportes',
        rol: 'reportes',
        permisos: [],
        mustChangePassword: false,
      },
    })

    render(
      <CanPerform permission="administracion:usuarios:gestionar" fallback={<span>Sin acceso</span>}>
        <span>Acción</span>
      </CanPerform>,
    )

    expect(screen.getByText('Sin acceso')).toBeInTheDocument()
    expect(screen.queryByText('Acción')).not.toBeInTheDocument()
  })

  it('array permission OR: renderiza si tiene alguno', () => {
    useAuthStore.setState({
      user: {
        id: 2,
        username: 'cajero',
        nombre: 'Cajero',
        rol: 'cajero',
        permisos: ['ventas:contado:crear'],
        mustChangePassword: false,
      },
    })

    render(
      <CanPerform permission={['ventas:contado:crear', 'administracion:usuarios:gestionar']}>
        <span>Acción</span>
      </CanPerform>,
    )

    expect(screen.getByText('Acción')).toBeInTheDocument()
  })
})
