const { v1: uuidv1, v3: uuidv3, v4: uuidv4, v5: uuidv5 } = require('uuid');
const util = require("../util/common");

class Entity {
    constructor(base) {
        this.uid = uuidv4();
        this.base = base;

        this.animaPath = new Map();
        this.userEvent = new Map();
        this.eventFunc = new Map();
    }

    getUID() {
        return this.uid;
    }

    getBase() {
        return this.base;
    }

    init() {

    }

    insertAnimaPath(t, point) {
        this.animaPath.set(t, point);
    }

    sortAnimaPath() {
        const sortMap = new Map([...this.animaPath].sort((a, b) => a[0] - b[0]));
        this.animaPath = sortMap;
    }

    clearAnimaPath() {
        this.animaPath.clear();
    }

    updateAnimaPath(t) {
        if (this.animaPath.size > 0) {
            const keysArray = [...this.animaPath.keys()];
            var indexKey = util.lower_bound(keysArray, t);
            if (indexKey < keysArray.length) {
                let point = {};
                var second = keysArray[indexKey];
                if (indexKey == 0) {
                    if (second <= t) {
                        point = this.animaPath.get(second);
                    }
                }
                else {
                    var first = keysArray[indexKey - 1];
                    var delta_time = second - first;
                    if (delta_time == 0.0) {
                        point = this.animaPath.get(first);
                    }
                    else {
                        var pointfirst = this.animaPath.get(first);
                        var pointsecond = this.animaPath.get(second);

                        point["空速"] = util.interpolate(
                            (t - first) / delta_time,
                            pointfirst["空速"],
                            pointsecond["空速"]);

                        point["升降率"] = util.interpolate(
                            (t - first) / delta_time,
                            pointfirst["升降率"],
                            pointsecond["升降率"]);

                        point["过载"] = util.interpolate(
                            (t - first) / delta_time,
                            pointfirst["过载"],
                            pointsecond["过载"]);

                        point["马赫数"] = util.interpolate(
                            (t - first) / delta_time,
                            pointfirst["马赫数"],
                            pointsecond["马赫数"]);

                        point["经度"] = util.interpolate(
                            (t - first) / delta_time,
                            pointfirst["经度"],
                            pointsecond["经度"]);

                        point["纬度"] = util.interpolate(
                            (t - first) / delta_time,
                            pointfirst["纬度"],
                            pointsecond["纬度"]);

                        point["海拔"] = util.interpolate(
                            (t - first) / delta_time,
                            pointfirst["海拔"],
                            pointsecond["海拔"]);

                        point["航向角"] = util.interpolate(
                            (t - first) / delta_time,
                            pointfirst["航向角"],
                            pointsecond["航向角"]);

                        point["俯仰角"] = util.interpolate(
                            (t - first) / delta_time,
                            pointfirst["俯仰角"],
                            pointsecond["俯仰角"]);

                        point["倾斜角"] = util.interpolate(
                            (t - first) / delta_time,
                            pointfirst["倾斜角"],
                            pointsecond["倾斜角"]);
                    }
                }
                return point;
            }
        }
    }

    insertUserEvent(t, event) {
        event["执行"] = 0;
        this.userEvent.set(t, event);
    }

    clearUserEvent() {
        this.userEvent.clear();
    }

    removeUserEvent(t) {
        this.userEvent.delete(t);
    }

    removeUserEvent(eventname, eventtype) {
        for (const [key, value] of this.userEvent) {
            let time = key;
            let name = value["事件"];
            let type = value["类型"];
            if (name == eventname && type == eventtype) {
                this.userEvent.delete(time);
            }
        }
    }

    bindUserEventFun(event, callback) {
        let name = event["事件"];
        let type = event["类型"];
        let strKey = name + ";" + type;
        this.eventFunc.set(strKey, callback);
    }

    updateUserEvent(t) {
        if (this.userEvent.size > 0) {
            const tArray = [...this.userEvent.keys()];
            var indexT = util.lower_bound(tArray, t);
            if (indexT < tArray.length) {
                var second = tArray[indexT];
                if (second <= t) {
                    let event = this.userEvent.get(second);
                    if (event["执行"] == 0) {
                        event["执行"] = 1;
                        //this.userEvent.set(second, event);

                        let name = event["事件"];
                        let type = event["类型"];
                        let para = event["参数"];

                        let callback = this.eventFunc.get(name + ";" + type);
                        if (callback) {
                            callback(para);
                        }

                        return event;
                    }
                }
            }
        }
    }
}

module.exports = Entity;