import { describe, it, expect, beforeEach } from 'vitest';
import { useAuthStore } from '@/lib/stores/auth-store';

describe('auth-store', () => {
  beforeEach(() => {
    // Reset store to initial state before each test
    useAuthStore.setState({
      user: null,
      role: null,
      isAuthenticated: false,
    });
  });

  it('starts with unauthenticated state', () => {
    const state = useAuthStore.getState();
    expect(state.user).toBeNull();
    expect(state.role).toBeNull();
    expect(state.isAuthenticated).toBe(false);
  });

  it('login(Super_Admin) sets the correct user and role', () => {
    useAuthStore.getState().login('Super_Admin');
    const state = useAuthStore.getState();

    expect(state.isAuthenticated).toBe(true);
    expect(state.role).toBe('Super_Admin');
    expect(state.user).not.toBeNull();
    expect(state.user!.role).toBe('Super_Admin');
    expect(state.user!.name).toBe('Carlos Admin');
  });

  it('login(Publisher_Admin) sets the correct user and role', () => {
    useAuthStore.getState().login('Publisher_Admin');
    const state = useAuthStore.getState();

    expect(state.isAuthenticated).toBe(true);
    expect(state.role).toBe('Publisher_Admin');
    expect(state.user).not.toBeNull();
    expect(state.user!.role).toBe('Publisher_Admin');
    expect(state.user!.name).toBe('María Publisher');
  });

  it('login(Viewer) sets the correct user and role', () => {
    useAuthStore.getState().login('Viewer');
    const state = useAuthStore.getState();

    expect(state.isAuthenticated).toBe(true);
    expect(state.role).toBe('Viewer');
    expect(state.user).not.toBeNull();
    expect(state.user!.role).toBe('Viewer');
    expect(state.user!.name).toBe('James Viewer');
  });

  it('logout() clears user, role, and isAuthenticated', () => {
    // Login first
    useAuthStore.getState().login('Super_Admin');
    expect(useAuthStore.getState().isAuthenticated).toBe(true);

    // Then logout
    useAuthStore.getState().logout();
    const state = useAuthStore.getState();

    expect(state.user).toBeNull();
    expect(state.role).toBeNull();
    expect(state.isAuthenticated).toBe(false);
  });

  it('switching roles updates user correctly', () => {
    useAuthStore.getState().login('Super_Admin');
    expect(useAuthStore.getState().user!.name).toBe('Carlos Admin');

    useAuthStore.getState().login('Viewer');
    expect(useAuthStore.getState().user!.name).toBe('James Viewer');
    expect(useAuthStore.getState().role).toBe('Viewer');
  });
});
