import { describe, it, expect, beforeEach } from 'vitest';
import { useFilterStore } from '@/lib/stores/filter-store';
import { getDefaultDateRange } from '@/lib/utils/date';

describe('filter-store', () => {
  beforeEach(() => {
    // Reset store to default state before each test
    useFilterStore.setState({
      dateRange: getDefaultDateRange(),
    });
  });

  it('starts with "Last 12 Months" as the default date range', () => {
    const state = useFilterStore.getState();
    expect(state.dateRange.label).toBe('Last 12 Months');
    expect(state.dateRange.start).toBeInstanceOf(Date);
    expect(state.dateRange.end).toBeInstanceOf(Date);
    expect(state.dateRange.start < state.dateRange.end).toBe(true);
  });

  it('setDateRange updates the date range', () => {
    const customRange = {
      start: new Date(2024, 0, 1),
      end: new Date(2024, 5, 30),
      label: 'Custom Range',
    };

    useFilterStore.getState().setDateRange(customRange);
    const state = useFilterStore.getState();

    expect(state.dateRange.label).toBe('Custom Range');
    expect(state.dateRange.start.getTime()).toBe(customRange.start.getTime());
    expect(state.dateRange.end.getTime()).toBe(customRange.end.getTime());
  });

  it('resetDateRange restores the default "Last 12 Months" range', () => {
    // Set a custom range first
    useFilterStore.getState().setDateRange({
      start: new Date(2023, 0, 1),
      end: new Date(2023, 11, 31),
      label: 'Year 2023',
    });
    expect(useFilterStore.getState().dateRange.label).toBe('Year 2023');

    // Reset
    useFilterStore.getState().resetDateRange();
    const state = useFilterStore.getState();

    expect(state.dateRange.label).toBe('Last 12 Months');
  });

  it('default range spans approximately 12 months', () => {
    const { start, end } = useFilterStore.getState().dateRange;
    const diffMs = end.getTime() - start.getTime();
    const diffDays = diffMs / (1000 * 60 * 60 * 24);

    // 12 months is roughly 365 days (±1 for leap years)
    expect(diffDays).toBeGreaterThanOrEqual(364);
    expect(diffDays).toBeLessThanOrEqual(367);
  });
});
