import T from "./TestHelper";
import SelectedElementTagsUpdater from "../Logic/Actors/SelectedElementTagsUpdater";
import UserRelatedState from "../Logic/State/UserRelatedState";
import {Utils} from "../Utils";
import SelectedFeatureHandler from "../Logic/Actors/SelectedFeatureHandler";
import {UIEventSource} from "../Logic/UIEventSource";
import {ElementStorage} from "../Logic/ElementStorage";
import Loc from "../Models/Loc";
import * as bookcaseJson from "../assets/generated/themes/bookcases.json"
import LayoutConfig from "../Models/ThemeConfig/LayoutConfig";

export default class ActorsSpec extends T {

    constructor() {

        const latestTags = {
            "amenity": "public_bookcase",
            "books": "children;adults",
            "capacity": "25",
            "description": "Deze boekenruilkast vindt je recht tegenover de Pim Pam Poem",
            "image:0": "https://i.imgur.com/Z8a69UG.jpg",
            "name": "Stubbekwartier-buurtbibliotheek",
            "nobrand": "yes",
            "opening_hours": "24/7",
            "operator": "Huisbewoner",
            "public_bookcase:type": "reading_box"
        }

        Utils.injectJsonDownloadForTests(
            "https://www.openstreetmap.org/api/0.6/node/5568693115",
            {
                "version": "0.6",
                "generator": "CGImap 0.8.5 (1815943 spike-06.openstreetmap.org)",
                "copyright": "OpenStreetMap and contributors",
                "attribution": "http://www.openstreetmap.org/copyright",
                "license": "http://opendatacommons.org/licenses/odbl/1-0/",
                "elements": [{
                    "type": "node",
                    "id": 5568693115,
                    "lat": 51.2179199,
                    "lon": 3.2154662,
                    "timestamp": "2021-08-21T16:22:55Z",
                    "version": 6,
                    "changeset": 110034454,
                    "user": "Pieter Vander Vennet",
                    "uid": 3818858,
                    "tags": latestTags
                }]
            }
        )

        super([
            [
                "download latest version",
                () => {
                    const state = new UserRelatedState(new LayoutConfig(<any> bookcaseJson, true, "tests"))
                    const feature = {
                        "type": "Feature",
                        "id": "node/5568693115",
                        "properties": {
                            "amenity": "public_bookcase",
                            "books": "children;adults",
                            "capacity": "25",
                            "description": "Deze boekenruilkast vindt je recht tegenover de Pim Pam Poem",
                            "image:0": "https://i.imgur.com/Z8a69UG.jpg",
                            "name": "OUTDATED NAME",
                            "nobrand": "yes",
                            "opening_hours": "24/7",
                            "operator": "Huisbewoner",
                            "public_bookcase:type": "reading_box",
                            "id": "node/5568693115",
                            "_lat": "51.2179199",
                            "_lon": "3.2154662",
                            "fixme": "SOME FIXME"
                        },
                        "geometry": {
                            "type": "Point",
                            "coordinates": [
                                3.2154662,
                                51.2179199
                            ]
                        },
                        "bbox": {
                            "maxLat": 51.2179199,
                            "maxLon": 3.2154662,
                            "minLat": 51.2179199,
                            "minLon": 3.2154662
                        },
                        "_lon": 3.2154662,
                        "_lat": 51.2179199
                    }
                    state.allElements.addOrGetElement(feature)
                    SelectedElementTagsUpdater.installCallback(state)

                    // THis should trigger a download of the latest feaures and update the tags
                    // However, this doesn't work with ts-node for some reason
                    state.selectedElement.setData(feature)

                    SelectedElementTagsUpdater.applyUpdate(state, latestTags, feature.properties.id)

                    // The name should be updated
                    T.equals("Stubbekwartier-buurtbibliotheek", feature.properties.name)
                    // The fixme should be removed
                    T.equals(undefined, feature.properties.fixme)

                }],
            ["Hash without selected element should download geojson from OSM-API", async () => {
                const hash = new UIEventSource("node/5568693115")
                const selected = new UIEventSource(undefined)
                const loc = new UIEventSource<Loc>({
                    lat: 0,
                    lon: 0,
                    zoom: 0
                })


                loc.addCallback(_ => {
                    T.equals("node/5568693115", selected.data.properties.id)
                    T.equals(14, loc.data.zoom)
                    T.equals(51.2179199, loc.data.lat)
                })

                new SelectedFeatureHandler(hash, {
                    selectedElement: selected,
                    allElements: new ElementStorage(),
                    featurePipeline: undefined,
                    locationControl: loc,
                    layoutToUse: undefined
                })


            }]


        ]);

    }


}