import BaseUIElement from "../BaseUIElement";
import {UIEventSource} from "../../Logic/UIEventSource";
import Combine from "./Combine";
import Title from "./Title";
import Hash from "../../Logic/Web/Hash";

export class Accordeon extends Combine {

    constructor(toggles: Toggleable[]) {

        for (const el of toggles) {
            el.isVisible.addCallbackAndRun(isVisible => toggles.forEach(toggle => {
                if (toggle !== el && isVisible) {
                    toggle.isVisible.setData(false)
                }
            }))
        }

        super(toggles);
    }

}


export default class Toggleable extends Combine {
    public readonly isVisible = new UIEventSource(false)

    constructor(title: Title | BaseUIElement, content: BaseUIElement) {
        super([title, content])
        content.SetClass("animate-height border-l-4 pl-2")
        title.SetClass("background-subtle rounded-lg")
        const self = this
        this.onClick(() => self.isVisible.setData(!self.isVisible.data))
        const contentElement = content.ConstructElement()

        if (title instanceof Title) {
            Hash.hash.addCallbackAndRun(h => {
                if (h === title.id) {
                    self.isVisible.setData(true)
                    content.RemoveClass("border-gray-300")
                    content.SetClass("border-red-300")
                } else {
                    content.SetClass("border-gray-300")
                    content.RemoveClass("border-red-300")
                }
            })
            this.isVisible.addCallbackAndRun(isVis => {
                if (isVis) {
                    Hash.hash.setData(title.id)
                }
            })
        }

        this.isVisible.addCallbackAndRun(isVisible => {
            if (isVisible) {
                contentElement.style.maxHeight = "100vh"
                contentElement.style["-webkit-mask-image"] = "unset"
            } else {
                contentElement.style["-webkit-mask-image"] = "-webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,1)), to(rgba(0,0,0,0)))"
                contentElement.style.maxHeight = "2rem"
            }
        })
    }

}