"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.GeoLocationHandler = void 0;
var UIEventSource_1 = require("../UI/UIEventSource");
var UIElement_1 = require("../UI/UIElement");
var leaflet_1 = require("leaflet");
var Helpers_1 = require("../Helpers");
var GeoLocationHandler = /** @class */ (function (_super) {
    __extends(GeoLocationHandler, _super);
    function GeoLocationHandler(map) {
        var _this = _super.call(this, undefined) || this;
        _this.currentLocation = new UIEventSource_1.UIEventSource(undefined);
        _this._isActive = new UIEventSource_1.UIEventSource(false);
        _this._permission = new UIEventSource_1.UIEventSource("");
        _this._map = map;
        _this.ListenTo(_this.currentLocation);
        _this.ListenTo(_this._isActive);
        _this.ListenTo(_this._permission);
        var self = _this;
        function onAccuratePositionProgress(e) {
            console.log(e.accuracy);
            console.log(e.latlng);
            self.currentLocation.setData({ latlng: e.latlng, accuracy: e.accuracy });
        }
        function onAccuratePositionFound(e) {
            console.log(e.accuracy);
            console.log(e.latlng);
            self.currentLocation.setData({ latlng: e.latlng, accuracy: e.accuracy });
        }
        function onAccuratePositionError(e) {
            console.log("onerror", e.message);
        }
        map.map.on('accuratepositionprogress', onAccuratePositionProgress);
        map.map.on('accuratepositionfound', onAccuratePositionFound);
        map.map.on('accuratepositionerror', onAccuratePositionError);
        var icon = leaflet_1.default.icon({
            iconUrl: './assets/crosshair-blue.svg',
            iconSize: [40, 40],
            iconAnchor: [20, 20],
        });
        _this.currentLocation.addCallback(function (location) {
            var newMarker = leaflet_1.default.marker(location.latlng, { icon: icon });
            newMarker.addTo(map.map);
            if (self._marker !== undefined) {
                map.map.removeLayer(self._marker);
            }
            self._marker = newMarker;
        });
        navigator.permissions.query({ name: 'geolocation' })
            .then(function (status) {
            console.log("Geolocation is already", status);
            if (status.state === "granted") {
                self.StartGeolocating();
            }
            self._permission.setData(status.state);
            status.onchange = function () {
                self._permission.setData(status.state);
            };
        });
        _this.HideOnEmpty(true);
        return _this;
    }
    GeoLocationHandler.prototype.InnerRender = function () {
        if (this.currentLocation.data) {
            return " ";
        }
        if (this._isActive.data) {
            return "
";
        }
        if (this._isActive.data) {
            return " ";
        }
        return "
";
        }
        return " ";
    };
    GeoLocationHandler.prototype.StartGeolocating = function () {
        var self = this;
        if (self._permission.data === "denied") {
            return "";
        }
        if (self.currentLocation.data !== undefined) {
            self._map.map.flyTo(self.currentLocation.data.latlng, 18);
        }
        console.log("Searching location using GPS");
        self._map.map.findAccuratePosition({
            maxWait: 10000,
            desiredAccuracy: 50 // defaults to 20
        });
        if (!self._isActive.data) {
            self._isActive.setData(true);
            Helpers_1.Helpers.DoEvery(60000, function () {
                self._map.map.findAccuratePosition({
                    maxWait: 10000,
                    desiredAccuracy: 50 // defaults to 20
                });
            });
        }
    };
    GeoLocationHandler.prototype.InnerUpdate = function (htmlElement) {
        _super.prototype.InnerUpdate.call(this, htmlElement);
        var self = this;
        htmlElement.onclick = function () {
            self.StartGeolocating();
        };
    };
    return GeoLocationHandler;
}(UIElement_1.UIElement));
exports.GeoLocationHandler = GeoLocationHandler;
";
    };
    GeoLocationHandler.prototype.StartGeolocating = function () {
        var self = this;
        if (self._permission.data === "denied") {
            return "";
        }
        if (self.currentLocation.data !== undefined) {
            self._map.map.flyTo(self.currentLocation.data.latlng, 18);
        }
        console.log("Searching location using GPS");
        self._map.map.findAccuratePosition({
            maxWait: 10000,
            desiredAccuracy: 50 // defaults to 20
        });
        if (!self._isActive.data) {
            self._isActive.setData(true);
            Helpers_1.Helpers.DoEvery(60000, function () {
                self._map.map.findAccuratePosition({
                    maxWait: 10000,
                    desiredAccuracy: 50 // defaults to 20
                });
            });
        }
    };
    GeoLocationHandler.prototype.InnerUpdate = function (htmlElement) {
        _super.prototype.InnerUpdate.call(this, htmlElement);
        var self = this;
        htmlElement.onclick = function () {
            self.StartGeolocating();
        };
    };
    return GeoLocationHandler;
}(UIElement_1.UIElement));
exports.GeoLocationHandler = GeoLocationHandler;