import { Application, Assets, Container, Sprite } from "pixi.js";
import { TimedGame } from "./timedGame";

export class Opinator extends TimedGame {
    constructor(ticker) {
        super(10000, ticker);
        this._inMove = false; // indicates if player has grabed the wire (is mouse down)
        this._currentScore = 0;
        this._pixelGoalScore = undefined;
        this._baseGoalScore = 8;
        this._goalScore = this._baseGoalScore * this._difficulty; // goal to match, measured in play area, 10 = moving the mouse on the equivalent of 10 play areas
        this._lastMousePos = undefined; // use to compute the travelled distance

        this.timeout = this._baseGoalScore * 1000; // 1s per sprite len
        this._gameDesc.text = "Répare opinator !!";
        this._instruction.text = "clique et agite la souris";

        this._backgroundSprite = Sprite.from("opinator");

        this._backgroundSprite.eventMode = "static";

        this._backgroundSprite.on("pointerdown", (event) => {
            console.log("Opinator grabbed");
            this._inMove = true;
            this._lastMousePos = event.client.clone();
        });

        this._backgroundSprite.on("pointerupoutside", () => {
            console.log("Opinator released");
            this._inMove = false;
            this._lastMousePos = undefined;
        });
        this._backgroundSprite.on("pointerup", () => {
            console.log("Opinator released");
            this._inMove = false;
            this._lastMousePos = undefined;
        });

        this._backgroundSprite.on("mousemove", (event) => {
            if (this._inMove && !this.won) {
                const newMousePos = event.client;
                const progress = Math.sqrt(
                    (newMousePos.x - this._lastMousePos.x) ** 2 +
                        (newMousePos.y - this._lastMousePos.y) ** 2,
                );
                if (progress > 0) {
                    this._lastMousePos = newMousePos.clone();
                    this._currentScore += progress;
                    console.log(
                        "mouse move, current score",
                        this._currentScore,
                        "goal",
                        this._pixelGoalScore,
                    );
                    if (this._pixelGoalScore < this._currentScore) {
                        this.end(true);
                    }
                } //else ignore, not enough move to get some distance
            }
        });
        this._backgroundSprite.layout = { objectFit: "contain" };
        this.gameContainer.layout = { width: "100%", height: "100%" };
        this._addGameObjectChild(this._backgroundSprite);
    }

    reset() {
        super.reset();
        this._currentScore = 0;
        this._pixelGoalScore = this._backgroundSprite.width * this._goalScore; // beware of resize mid game
    }

    start() {
        super.start();
    }
}
