// Feature: snowui-dashboard-redesign, Property 4: Right Panel tab state consistency
// **Validates: Requirements 3.2**

import { describe, it, expect, beforeEach } from 'vitest';
import * as fc from 'fast-check';
import { useRightPanelStore, type RightPanelTab } from '@/lib/stores/right-panel-store';

const TABS: RightPanelTab[] = ['notifications', 'activities', 'contacts'];

describe('Property 4: Right Panel tab state consistency', () => {
  beforeEach(() => {
    // Reset store to default state before each test
    useRightPanelStore.setState({
      isOpen: false,
      activeTab: 'notifications',
    });
  });

  it('for any sequence of setActiveTab calls, activeTab always equals the last call argument', () => {
    fc.assert(
      fc.property(
        fc.array(fc.constantFrom<RightPanelTab>(...TABS), { minLength: 1, maxLength: 20 }),
        (tabSequence) => {
          // Reset store
          useRightPanelStore.setState({ activeTab: 'notifications' });

          // Apply all setActiveTab calls in sequence
          for (const tab of tabSequence) {
            useRightPanelStore.getState().setActiveTab(tab);
          }

          // activeTab should equal the last call's argument
          const lastTab = tabSequence[tabSequence.length - 1];
          expect(useRightPanelStore.getState().activeTab).toBe(lastTab);
        },
      ),
      { numRuns: 100 },
    );
  });

  it('setActiveTab does not affect isOpen state', () => {
    fc.assert(
      fc.property(
        fc.constantFrom<RightPanelTab>(...TABS),
        fc.boolean(),
        (tab, initialOpen) => {
          // Set initial open state
          useRightPanelStore.setState({ isOpen: initialOpen });

          // Call setActiveTab
          useRightPanelStore.getState().setActiveTab(tab);

          // isOpen should remain unchanged
          expect(useRightPanelStore.getState().isOpen).toBe(initialOpen);
        },
      ),
      { numRuns: 100 },
    );
  });

  it('toggle flips isOpen state without affecting activeTab', () => {
    fc.assert(
      fc.property(
        fc.constantFrom<RightPanelTab>(...TABS),
        fc.boolean(),
        (tab, initialOpen) => {
          // Set initial state
          useRightPanelStore.setState({ isOpen: initialOpen, activeTab: tab });

          // Toggle
          useRightPanelStore.getState().toggle();

          // isOpen should be flipped
          expect(useRightPanelStore.getState().isOpen).toBe(!initialOpen);
          // activeTab should remain unchanged
          expect(useRightPanelStore.getState().activeTab).toBe(tab);
        },
      ),
      { numRuns: 100 },
    );
  });
});
