import Container from "./database/Container";
import {SensorType} from "./SensorType";
import {SensorHelper} from "./SensorHelper";
import {WebSocketHandler} from "./WebSocketHandler";
import {WebSocketPayload} from "./WebSocketPayload";
import {WebSocketEvent} from "./WebSocketEvent";
import debug from "debug";
import {iTender} from "./iTender";

const log = debug("itender:container");

export class ContainerHelper {

    /**
     * Measure all containers based on their sensor values
     */
    static measureContainers(): Promise<void> {
        log("Measuring containers...");

        return new Promise(async resolve => {
            for (let c of (await Container.find({}))) {
                if (c.sensorType != SensorType.NONE) {

                    let weight;
                    try {
                        weight = await SensorHelper.measureRaw(c);
                    } catch (e) {
                        await WebSocketHandler.send(new WebSocketPayload(WebSocketEvent.ERROR, "Ein Sensor hat beim Austarieren einen ungültigen Wert zurückgegeben.<br>Dies weist auf eine Fehlkonfiguration oder kaputten Sensor hin.<br>Aus Sicherheitsgründen wurde der Sensor für diesen Behälter deaktiviert."));
                        continue;
                    }


                    // V2: New calculation method
                    /*
                      (WEIGHT_VAL - NO_WEIGHT_VAL) / Sensitivitätsfaktor = Gewicht in Gramm
                      (WEIGHT_VAL - NO_WEIGHT_VAL) / (100g_val /100) ist die Formel zur Berechnung des Gewichts in Gramm nach der Kalibrierung mit einem 100 Gramm Gewicht.
                      100g_val /100 gibt den Sensitivitätsfaktor an, der angibt, wie viel sich der Sensorwert ändert, wenn sich das Gewicht um ein Gramm ändert.
                      Durch die Division von 100g_val durch 100 wird der Sensitivitätsfaktor berechnet, und durch die Division von (WEIGHT_VAL - NO_WEIGHT_VAL) durch den Sensitivitätsfaktor wird das Gewicht in Gramm berechnet.

                      Beispiel:
                      (WEIGHT_VAL - NO_WEIGHT_VAL) / (100g_val /100) = Gewicht in Gramm
                      (2400 - 2000) / (2450 /100) = 80 Gramm
                    */
                    let newFilled = weight - c.sensorDelta / iTender.sensitivityFactor;

                    if (newFilled <= 3 && c.filled != -1) {
                        c.filled = -1;
                        // Container is empty!
                    } else {
                        // Container > 2
                        c.filled = newFilled;
                    }

                    await c.save();
                }

            }
            log("Containers measured!");
            resolve();

            let payload = new WebSocketPayload(WebSocketEvent.CONTAINERS, (await Container.find()));
            await WebSocketHandler.send(payload);
        });
    }
}