import { DoricViewNode, toRGBAString } from "./DoricViewNode";

export class DoricSwitchNode extends DoricViewNode {
    input?: HTMLInputElement
    box?: HTMLDivElement
    span?: HTMLSpanElement
    onSwitchFuncId?: string

    private offTintColor = "#e6e6e6"
    private onTintColor = "#52d769"

    build() {
        const ret = document.createElement('div')
        ret.style.position = "relative"
        ret.style.width = "50px"
        ret.style.height = "30px"
        const input = document.createElement('input')
        input.type = "checkbox"
        input.style.display = "none"
        const box = document.createElement('div')
        box.style.width = "100%"
        box.style.height = "100%"
        box.style.backgroundColor = "#ccc"
        box.style.borderRadius = "15px"
        const span = document.createElement('span')
        span.style.display = "inline-block"
        span.style.height = "30px"
        span.style.width = "30px"
        span.style.borderRadius = "15px"
        span.style.background = "#fff"
        span.style.boxShadow = "0px 3px 3px #eee"
        box.appendChild(span)
        ret.appendChild(input)
        ret.appendChild(box)
        ret.onclick = () => {
            try {

                if (input.checked === false) {
                    span.animate(
                        [{ transform: "translateX(0px)" }, { transform: "translateX(30px)" }], {
                        duration: 200,
                        fill: "forwards"
                    })
                    box.animate([{ backgroundColor: this.offTintColor }, { backgroundColor: this.onTintColor }], {
                        duration: 200,
                        fill: "forwards"
                    })
                    input.checked = true
                } else {
                    span.animate([{ transform: "translateX(30px)" }, { transform: "translateX(0px)" }], {
                        duration: 200,
                        fill: "forwards"
                    })
                    box.animate([{ backgroundColor: this.onTintColor }, { backgroundColor: this.offTintColor }], {
                        duration: 200,
                        fill: "forwards"
                    })
                    input.checked = false
                }
                if (this.onSwitchFuncId) {
                    this.callJSResponse(this.onSwitchFuncId, input.checked)
                }
            } catch (e) {
                alert(e)
            }

        }
        this.input = input
        this.span = span
        this.box = box
        return ret
    }

    private setChecked(v: boolean) {
        if (!this.input || !this.span || !this.box) {
            return
        }
        if (v) {
            this.span.style.transform = "translateX(30px)"
            this.box.style.backgroundColor = this.onTintColor
            this.input.checked = v
        } else {
            this.span.style.transform = "translateX(0px)"
            this.box.style.backgroundColor = this.offTintColor
            this.input.checked = v
        }
    }

    blendProps(v: HTMLElement, propName: string, prop: any) {
        switch (propName) {
            case "state":
                this.setChecked(prop)
                break
            case "onSwitch":
                this.onSwitchFuncId = prop
                break
            case "offTintColor":
                this.offTintColor = toRGBAString(prop)
                this.setChecked(this.getState())
                break
            case "onTintColor":
                this.onTintColor = toRGBAString(prop)
                this.setChecked(this.getState())
                break
            case "thumbTintColor":
                if (this.span) {
                    this.span.style.backgroundColor = toRGBAString(prop)
                }
                break
            default:
                super.blendProps(v, propName, prop)
                break
        }
    }

    getState() {
        return this.input?.checked || false
    }
}
