import { cleanup } from "@testing-library/react";
import { afterEach, expect } from "vitest";
import * as matchers from "@testing-library/jest-dom/matchers";

// Extend Vitest's expect with jest-dom matchers
expect.extend(matchers);

// Cleanup after each test to prevent test pollution
afterEach(() => {
  cleanup();
});

// Mock window.matchMedia for tests that might use it
Object.defineProperty(window, "matchMedia", {
  writable: true,
  value: (query: string) => ({
    matches: false,
    media: query,
    onchange: null,
    addListener: () => {},
    removeListener: () => {},
    addEventListener: () => {},
    removeEventListener: () => {},
    dispatchEvent: () => false,
  }),
});

// Ensure localStorage exists with a full Storage API for tests.
// Avoid touching the built-in accessor (which emits warnings in Node).
let storageStore: Record<string, string> = {};
const storageMock: Storage = {
  getItem: (key: string): string | null => storageStore[key] ?? null,
  setItem: (key: string, value: string): void => {
    storageStore[key] = value;
  },
  removeItem: (key: string): void => {
    // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
    delete storageStore[key];
  },
  clear: (): void => {
    storageStore = {};
  },
  get length(): number {
    return Object.keys(storageStore).length;
  },
  key: (index: number): string | null => {
    const keys = Object.keys(storageStore);
    return keys[index] ?? null;
  },
};

Object.defineProperty(window, "localStorage", {
  value: storageMock,
  writable: true,
  configurable: true,
});
