export class ExclusiveDetails {
    private detailsElements: NodeListOf<HTMLDetailsElement>;

    constructor(selector: string) {
        this.detailsElements = document.querySelectorAll(selector);

        // Bind event listeners
        this.bindEvents();
    }

    private bindEvents(): void {
        // Handle click on each details element
        this.detailsElements.forEach((details) => {
            details.addEventListener("click", (e) =>
                this.handleDetailsClick(e, details),
            );
        });

        // Handle click outside details elements
        document.addEventListener("click", (e) => this.handleClickOutside(e));
    }

    private handleDetailsClick(
        event: MouseEvent,
        details: HTMLDetailsElement,
    ): void {
        event.stopPropagation(); // Prevent event from bubbling to document

        // Close other details elements
        this.detailsElements.forEach((otherDetails) => {
            if (otherDetails !== details) {
                otherDetails.removeAttribute("open");
            }
        });
    }

    private handleClickOutside(event: MouseEvent): void {
        const target = event.target as HTMLElement;
        const isClickInside = Array.from(this.detailsElements).some(
            (details) => details.contains(target),
        );

        // If click is outside all details elements, close them
        if (!isClickInside) {
            this.closeAll();
        }
    }

    private closeAll(): void {
        this.detailsElements.forEach((details) => {
            details.removeAttribute("open");
        });
    }
}

// Usage
