import * as solid_js from 'solid-js';
import { JSX } from 'solid-js';
import { IFilterXSSOptions } from 'xss';

type LRUOptions = {
    strategy: "static";
    limit: number;
} | {
    strategy: "grow";
    initial?: number;
} | {
    strategy: "unlimited";
};
declare class LRUCache<K, V> implements Iterable<[K, V]> {
    private cache;
    private readonly strategy;
    capacity: number;
    constructor(cap: number | LRUOptions, entries?: Iterable<[K, V]>);
    get size(): number;
    get(key: K): V | undefined;
    set(key: K, value: V): this;
    delete(key: K): V | undefined;
    entries(): IterableIterator<[K, V]>;
    [Symbol.iterator](): IterableIterator<[K, V]>;
}

/* ───────── helpers ───────── */
type NonEmptyArray<T> = readonly [T, ...T[]];

type SanitizeToggle =
	| {
			readonly SANITIZE: true;
			readonly SANITIZE_OPTIONS?: Partial<IFilterXSSOptions>;
	  }
	| {
			readonly SANITIZE?: false;
			readonly SANITIZE_OPTIONS?: never;
	  };

/* ───────── types ───────── */
type IconifySpecifier = string;
type IconifyFlip = "horizontal" | "vertical" | "horizontal,vertical";
type IconifyRotate = "90deg" | "180deg" | "270deg";

/* ───────── shapes ───────── */
interface IconifyMockParams {
	flip?: IconifyFlip;
	rotate?: IconifyRotate;
	box?: boolean;
}

interface IconifyVisibility {
	showLoading?: boolean;
	showError?: boolean;
}

interface IconifyIconProps
	extends JSX.SvgSVGAttributes<SVGSVGElement>,
		IconifyVisibility,
		IconifyMockParams {
	icon: IconifySpecifier;
}

/* ───────── data structures ───────── */
interface IconifyData {
	vBox: number[];
	body: string;
}
type IconifyCollectionCache = Map<string, IconifyIconCache>;
type IconifyIconCache = LRUCache<string, Promise<IconifyData>>;

type IconifyCacheConfiguration =
	| { strategy: "no-cache" }
	| { strategy: "unlimited" }
	| { strategy: "grow"; initial: number }
	| { strategy: "static"; limit: number }
	| number; // infer to be static

/* ───────── configuration ───────── */
type IconifyConfig = Readonly<{
	ICONIFY_API: string | URL | NonEmptyArray<string | URL>;
	REQUEST_OPTIONS: RequestInit;
	CACHE: IconifyCacheConfiguration;
}> &
	SanitizeToggle;

declare function configureIconify(patch: Partial<IconifyConfig>): void;

declare function Icon(props: IconifyIconProps): solid_js.JSX.Element;

export { type IconifyCacheConfiguration, type IconifyCollectionCache, type IconifyConfig, type IconifyData, type IconifyFlip, type IconifyIconCache, type IconifyIconProps, type IconifyMockParams, type IconifyRotate, type IconifySpecifier, type IconifyVisibility, type SanitizeToggle, configureIconify, Icon as default };
