import { Pixmap } from "./haku.js";
import { OnlineUsers } from "./online-users.js";

export class Chunk {
    constructor(size) {
        this.pixmap = new Pixmap(size, size);
        this.canvas = new OffscreenCanvas(size, size);
        this.ctx = this.canvas.getContext("2d");
        this.renderDirty = false;
    }

    syncFromPixmap() {
        this.ctx.putImageData(this.pixmap.getImageData(), 0, 0);
    }

    syncToPixmap() {
        let imageData = this.ctx.getImageData(0, 0, this.canvas.width, this.canvas.height);
        this.pixmap.getImageData().data.set(imageData.data, 0);
    }

    markModified() {
        this.renderDirty = true;
    }
}

export class Wall {
    #chunks = new Map();

    constructor(wallInfo) {
        this.chunkSize = wallInfo.chunkSize;
        this.onlineUsers = new OnlineUsers(wallInfo);
    }

    static chunkKey(x, y) {
        return `(${x},${y})`;
    }

    getChunk(x, y) {
        return this.#chunks.get(Wall.chunkKey(x, y));
    }

    getOrCreateChunk(x, y) {
        let key = Wall.chunkKey(x, y);
        if (this.#chunks.has(key)) {
            return this.#chunks.get(key);
        } else {
            let chunk = new Chunk(this.chunkSize);
            this.#chunks.set(key, chunk);
            return chunk;
        }
    }
}