import {Changes} from "../Osm/Changes";
import Constants from "../../Models/Constants";
import {UIEventSource} from "../UIEventSource";
import {Utils} from "../../Utils";

export default class PendingChangesUploader {

    private lastChange: Date;

    constructor(changes: Changes, selectedFeature: UIEventSource<any>) {
        const self = this;
        this.lastChange = new Date();
        changes.pendingChanges.addCallback(() => {
            self.lastChange = new Date();

            window.setTimeout(() => {
                const diff = (new Date().getTime() - self.lastChange.getTime()) / 1000;
                if (Constants.updateTimeoutSec >= diff - 1) {
                    changes.flushChanges("Flushing changes due to timeout");
                }
            }, Constants.updateTimeoutSec * 1000);
        });


        selectedFeature
            .stabilized(10000)
            .addCallback(feature => {
                if (feature === undefined) {
                    // The popup got closed - we flush
                    changes.flushChanges("Flushing changes due to popup closed");
                }
            });

        if (Utils.runningFromConsole) {
            return;
        }

        document.addEventListener('mouseout', e => {
            // @ts-ignore
            if (!e.toElement && !e.relatedTarget) {
                changes.flushChanges("Flushing changes due to focus lost");
            }
        });

        document.onfocus = () => {
            changes.flushChanges("OnFocus")
        }

        document.onblur = () => {
            changes.flushChanges("OnFocus")
        }
        try {
            document.addEventListener("visibilitychange", () => {
                changes.flushChanges("Visibility change")
            }, false);
        } catch (e) {
            console.warn("Could not register visibility change listener", e)
        }


        function onunload(e) {
            if (changes.pendingChanges.data.length == 0) {
                return;
            }
            changes.flushChanges("onbeforeunload - probably closing or something similar");
            e.preventDefault();
            return "Saving your last changes..."
        }

        window.onbeforeunload = onunload
        // https://stackoverflow.com/questions/3239834/window-onbeforeunload-not-working-on-the-ipad#4824156
        window.addEventListener("pagehide", onunload)

    }


}