import { PrivateDiagramLookupService } from "@peek/peek_plugin_diagram/_private/services/PrivateDiagramLookupService";
import { PrivateDiagramCoordSetService } from "@peek/peek_plugin_diagram/_private/services/PrivateDiagramCoordSetService";
import { PrivateDiagramPositionService } from "@peek/peek_plugin_diagram/_private/services/PrivateDiagramPositionService";
import {
    DispActionEnum,
    DispActionPositionOnDataT,
    DispBase,
    DispBaseT,
} from "../canvas-shapes/DispBase";
import { assert } from "../DiagramUtil";

/**
 * Peek Canvas Actioner
 *
 * This class is contains the logic for applying the actions from
 * the DispBase.action(disp)
 *
 */
export class PeekCanvasActioner {
    constructor(
        private modelSetKey: string,
        private coordSetCache: PrivateDiagramCoordSetService,
        private lookupService: PrivateDiagramLookupService,
        private positionService: PrivateDiagramPositionService
    ) {}

    hasAction(disp: DispBaseT): boolean {
        return (
            DispBase.action(disp) != null &&
            DispBase.action(disp) != DispActionEnum.none
        );
    }

    applyAction(disp: DispBaseT): void {
        assert(this.hasAction(disp), "Disp has no action to perform.");

        const action = DispBase.action(disp);
        const data = DispBase.data(disp);

        switch (action) {
            case DispActionEnum.none:
                break;

            case DispActionEnum.positionOn: {
                const posData: DispActionPositionOnDataT | null =
                    data["actionPos"];
                if (posData == null) {
                    console.log(
                        "actionPos data is missing for position on action"
                    );
                    break;
                }

                const coordSet = this.coordSetCache.coordSetForKey(
                    this.modelSetKey,
                    posData.k
                );

                if (coordSet == null) {
                    console.log(
                        `Can not find coordSet with key=|${posData.k}|`
                    );
                }

                this.positionService.position(
                    coordSet.key,
                    posData.x,
                    posData.y,
                    posData.z
                );
                break;
            }
        }
    }
}
