import { Haku } from "./haku.js";
import { Painter } from "./painter.js";

export class User {
    nickname = "";
    brush = "";
    reticle = null;

    isBrushOk = false;

    constructor(wallInfo, nickname) {
        this.nickname = nickname;

        this.haku = new Haku(wallInfo.hakuLimits);
        this.painter = new Painter(wallInfo.paintArea);
    }

    destroy() {
        this.haku.destroy();
    }

    setBrush(brush) {
        console.groupCollapsed("setBrush", this.nickname);
        let compileResult = this.haku.setBrush(brush);
        console.log("compiling brush complete", compileResult);
        console.groupEnd();

        this.isBrushOk = compileResult.status == "ok";

        return compileResult;
    }

    renderBrushToChunks(wall, x, y) {
        console.groupCollapsed("renderBrushToChunks", this.nickname);
        let result = this.painter.renderBrushToWall(this.haku, x, y, wall);
        console.log("rendering brush to chunks complete");
        console.groupEnd();

        return result;
    }
}

export class OnlineUsers extends EventTarget {
    #wallInfo;
    #users = new Map();

    constructor(wallInfo) {
        super();

        this.#wallInfo = wallInfo;
    }

    addUser(sessionId, { nickname, brush }) {
        if (!this.#users.has(sessionId)) {
            console.info("user added", sessionId, nickname);

            let user = new User(this.#wallInfo, nickname);
            user.setBrush(brush);
            this.#users.set(sessionId, user);
            return user;
        } else {
            console.info("user already exists", sessionId, nickname);
            return this.#users.get(sessionId);
        }
    }

    getUser(sessionId) {
        return this.#users.get(sessionId);
    }

    removeUser(sessionId) {
        if (this.#users.has(sessionId)) {
            let user = this.#users.get(sessionId);
            user.destroy();
            console.info("user removed", sessionId, user.nickname);
            // TODO: Cleanup reticles
            this.#users.delete(sessionId);
        }
    }
}