import Combine from "../Base/Combine";
import {UIEventSource} from "../../Logic/UIEventSource";
import {OsmConnection} from "../../Logic/Osm/OsmConnection";
import Translations from "../i18n/Translations";
import Title from "../Base/Title";
import ValidatedTextField from "../Input/ValidatedTextField";
import {SubtleButton} from "../Base/SubtleButton";
import Svg from "../../Svg";
import {LocalStorageSource} from "../../Logic/Web/LocalStorageSource";
import Toggle from "../Input/Toggle";
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
import FeaturePipeline from "../../Logic/FeatureSource/FeaturePipeline";
import FilteredLayer from "../../Models/FilteredLayer";

export default class NewNoteUi extends Toggle {

    constructor(noteLayer: FilteredLayer,
                isShown: UIEventSource<boolean>,
                state: {
                    LastClickLocation: UIEventSource<{ lat: number, lon: number }>,
                    osmConnection: OsmConnection, layoutToUse: LayoutConfig, featurePipeline: FeaturePipeline
                }) {

        const t = Translations.t.notes;
        const isCreated = new UIEventSource(false);
        state.LastClickLocation.addCallbackAndRun(_ => isCreated.setData(false)) // Reset 'isCreated' on every click
        const text = ValidatedTextField.InputForType("text", {
            value: LocalStorageSource.Get("note-text")
        })
        text.SetClass("border rounded-sm border-grey-500")

        const postNote = new SubtleButton(Svg.addSmall_svg().SetClass("max-h-7"), t.createNote)
        postNote.onClick(async () => {
            let txt = text.GetValue().data
            if (txt === undefined || txt === "") {
                return;
            }
            txt += "\n\n #MapComplete #" + state?.layoutToUse?.id
            const loc = state.LastClickLocation.data;
            state?.osmConnection?.openNote(loc.lat, loc.lon, txt)
            text.GetValue().setData("")
            isCreated.setData(true)
        })
        const createNoteDialog = new Combine([
            new Title(t.createNoteTitle),
            t.createNoteIntro,
            text,
            new Combine([new Toggle(undefined, t.warnAnonymous, state?.osmConnection?.isLoggedIn).SetClass("alert"), postNote]).SetClass("flex justify-end items-center")
        ]).SetClass("flex flex-col border-2 border-black rounded-xl p-4");


        const newNoteUi = new Toggle(
            new Toggle(t.isCreated.SetClass("thanks"),
                createNoteDialog,
                isCreated
            ),
            undefined,
            new UIEventSource<boolean>(true)
        )

        super(
            new Toggle(
               
                new Combine(
                    [
                        t.noteLayerHasFilters.SetClass("alert"),
                        new SubtleButton(Svg.filter_svg(), t.disableAllNoteFilters).onClick(() => {
                            const filters = noteLayer.appliedFilters.data;
                            for (const key of Array.from(filters.keys())) {
                                filters.set(key, undefined)
                            }
                            noteLayer.appliedFilters.ping()
                            isShown.setData(false);
                        })
                    ]
                ).SetClass("flex flex-col"),
                newNoteUi,
                noteLayer.appliedFilters.map(filters => Array.from(filters.values()).some(v => v !== undefined))
            ),
            new Combine([
                t.noteLayerNotEnabled.SetClass("alert"),
                new SubtleButton(Svg.layers_svg(), t.noteLayerDoEnable).onClick(() => {
                    noteLayer.isDisplayed.setData(true);
                    isShown.setData(false);
                })
            ]).SetClass("flex flex-col"),
            noteLayer.isDisplayed
        );
    }


}
