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
