import {UIElement} from "./UIElement";
import {FixedUiElement} from "./Base/FixedUiElement";
import {UIEventSource} from "../Logic/UIEventSource";

export class SlideShow extends UIElement {

    private readonly _embeddedElements: UIEventSource<UIElement[]>

    public readonly _currentSlide: UIEventSource<number> = new UIEventSource<number>(0);
    private readonly _noimages: UIElement;
    private _prev: FixedUiElement;
    private _next: FixedUiElement;

    constructor(
        embeddedElements: UIEventSource<UIElement[]>,
        noImages: UIElement) {
        super(embeddedElements);
        this._embeddedElements = embeddedElements;
        this.ListenTo(this._currentSlide);
        this._noimages = noImages;

        const self = this;
        this._prev = new FixedUiElement("<div class='prev-button'>" +
            "<div class='vspan'></div>" +
            "<img src='assets/arrow-left-smooth.svg' alt='Prev'/>" +
            "</div>")
            .onClick(() => {
                const current = self._currentSlide.data;
                self.MoveTo(current - 1);
            });
        this._next = new FixedUiElement("<div class='next-button'>" +
            "<div class='vspan'></div>" +
            "<img src='assets/arrow-right-smooth.svg' alt='Next'/>" +
            "</div>")
            .onClick(() => {
                const current = self._currentSlide.data;
                self.MoveTo(current + 1);
            });

    }

    InnerRender(): string {
        if (this._embeddedElements.data.length == 0) {
            return this._noimages.Render();
        }

        if (this._embeddedElements.data.length == 1) {
            return "<div class='image-slideshow'><div class='slides'><div class='slide'>" +
                this._embeddedElements.data[0].Render() +
                "</div></div></div>";
        }


        let slides = ""
        for (let i = 0; i < this._embeddedElements.data.length; i++) {
            let embeddedElement = this._embeddedElements.data[i];
            let state = "hidden"
            if (this._currentSlide.data === i) {
                state = "active-slide";
            }
            slides += "      <div class=\"slide " + state + "\">" + embeddedElement.Render() + "</div>\n";
        }
        return "<div class='image-slideshow'>"
            + this._prev.Render()
            + "<div class='slides'>" + slides + "</div>"
            + this._next.Render()
            + "</div>";
    }

    public MoveTo(index: number) {
        if (index < 0) {
            index = this._embeddedElements.data.length - 1;
        }
        index = index % this._embeddedElements.data.length;
        this._currentSlide.setData(index);
    }

    InnerUpdate(htmlElement) {
        this._next.Update();
        this._prev.Update();
    }

    Activate() {
        for (const embeddedElement of this._embeddedElements.data) {
            embeddedElement.Activate();
        }
        this._next.Update();
        this._prev.Update();
    }

}