import { describe, it, expect, beforeEach } from 'vitest'
import { renderHook } from '@testing-library/react'
import { useAuthStore } from '../../../stores/authStore'
import { usePermission } from '../../../features/auth/hooks/usePermission'

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

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

    const { result } = renderHook(() => usePermission('administracion:usuarios:gestionar'))
    expect(result.current).toBe(true)
  })

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

    const { result } = renderHook(() => usePermission('administracion:usuarios:gestionar'))
    expect(result.current).toBe(false)
  })

  it('F-01-03: user con permisos vacíos → false', () => {
    useAuthStore.setState({
      user: {
        id: 3,
        username: 'reportes',
        nombre: 'Reportes',
        rol: 'reportes',
        permisos: [],
        mustChangePassword: false,
      },
    })

    const { result } = renderHook(() => usePermission('administracion:usuarios:gestionar'))
    expect(result.current).toBe(false)
  })

  it('F-01-04: sin user (null) → false', () => {
    useAuthStore.setState({ user: null })

    const { result } = renderHook(() => usePermission('administracion:usuarios:gestionar'))
    expect(result.current).toBe(false)
  })

  it('array input OR: true si alguno de los permisos hace match', () => {
    useAuthStore.setState({
      user: {
        id: 2,
        username: 'cajero',
        nombre: 'Cajero',
        rol: 'cajero',
        permisos: ['ventas:contado:crear'],
        mustChangePassword: false,
      },
    })

    const { result } = renderHook(() =>
      usePermission(['ventas:contado:crear', 'administracion:usuarios:gestionar']),
    )
    expect(result.current).toBe(true)
  })

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

    const { result } = renderHook(() =>
      usePermission(['administracion:usuarios:gestionar', 'administracion:roles:gestionar']),
    )
    expect(result.current).toBe(false)
  })
})
