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

export default async function WebsocketContainerUpdate<TypeWebSocketEvent>(msg: WebSocketPayload) {
    let container: IContainer | null = await Container.findById(msg.data["container"]);
    if (!container) return;

    let ingredient;
    if (msg.data["ingredient"] != null) {
        ingredient = await Ingredient.findById(msg.data["ingredient"]);
        if (!ingredient)
            ingredient = undefined;
    }

    let filled: number = parseInt(msg.data["filled"]);

    container.filled = filled;
    container.volume = filled; // V2: Volume is now being updated after change of ingredient

    if (container.sensorType != SensorType.NONE) {
        let raw = SensorHelper.measureRaw(container);
        if (!raw) {
            await WebSocketHandler.send(new WebSocketPayload(WebSocketEvent.ERROR, "Der 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."));
        } else {
            container.sensorDelta = await raw - filled; // V2: Kalkuliere differenz zwischen Gewicht und gefülltem Inhalt // Todo Möglicherweise ist der "raw"-Wert nicht Gewicht
        }
    }


    container.content = ingredient;

    await container.save();

    await ContainerHelper.measureContainers();
    await iTender.refreshDrinks();
}