"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.QuadtreeTile = exports.QuadtreeTileLoadState = void 0;
// * The state of a {@link QuadtreeTile} in the tile load pipeline.
var QuadtreeTileLoadState;
(function (QuadtreeTileLoadState) {
    /**
     * The tile is new and loading has not yet begun.
     */
    QuadtreeTileLoadState[QuadtreeTileLoadState["START"] = 0] = "START";
    /**
     * Loading is in progress.
     */
    QuadtreeTileLoadState[QuadtreeTileLoadState["LOADING"] = 1] = "LOADING";
    /**
     * Loading is complete.
     */
    QuadtreeTileLoadState[QuadtreeTileLoadState["DONE"] = 2] = "DONE";
    /**
     * The tile has failed to load.
     */
    QuadtreeTileLoadState[QuadtreeTileLoadState["FAILED"] = 3] = "FAILED";
})(QuadtreeTileLoadState = exports.QuadtreeTileLoadState || (exports.QuadtreeTileLoadState = {}));
;
var QuadtreeTile = /** @class */ (function () {
    function QuadtreeTile(options) {
        this.state = QuadtreeTileLoadState.START;
        this._tilingScheme = options.tilingScheme;
        this._x = options.x;
        this._y = options.y;
        this._level = options.level;
        this._parent = options.parent;
        this._rectangle = this._tilingScheme.tileXYToRectangle(this._x, this._y, this._level);
        this._southwestChild = undefined;
        this._southeastChild = undefined;
        this._northwestChild = undefined;
        this._northeastChild = undefined;
        // TileReplacementQueue gets/sets these private properties.
        this.replacementPrevious = undefined;
        this.replacementNext = undefined;
    }
    Object.defineProperty(QuadtreeTile.prototype, "northwestChild", {
        get: function () {
            if (!this._northwestChild) {
                this._northwestChild = new QuadtreeTile({
                    tilingScheme: this._tilingScheme,
                    x: this._x * 2,
                    y: this._y * 2,
                    level: this._level + 1,
                    parent: this,
                });
            }
            return this._northwestChild;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(QuadtreeTile.prototype, "southwestChild", {
        get: function () {
            if (!this._southwestChild) {
                this._southwestChild = new QuadtreeTile({
                    tilingScheme: this._tilingScheme,
                    x: this._x * 2,
                    y: this._y * 2 + 1,
                    level: this._level + 1,
                    parent: this,
                });
            }
            return this._southwestChild;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(QuadtreeTile.prototype, "southeastChild", {
        get: function () {
            if (!this._southeastChild) {
                this._southeastChild = new QuadtreeTile({
                    tilingScheme: this._tilingScheme,
                    x: this._x * 2 + 1,
                    y: this._y * 2 + 1,
                    level: this._level + 1,
                    parent: this,
                });
            }
            return this._southeastChild;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(QuadtreeTile.prototype, "northeastChild", {
        get: function () {
            if (!this._northeastChild) {
                this._northeastChild = new QuadtreeTile({
                    tilingScheme: this._tilingScheme,
                    x: this._x * 2 + 1,
                    y: this._y * 2,
                    level: this._level + 1,
                    parent: this,
                });
            }
            return this._northeastChild;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(QuadtreeTile.prototype, "children", {
        get: function () {
            return [
                this.northwestChild,
                this.northeastChild,
                this.southwestChild,
                this.southeastChild,
            ];
        },
        enumerable: false,
        configurable: true
    });
    QuadtreeTile.createLevelZeroTiles = function (tilingScheme) {
        var numberOfLevelZeroTilesX = tilingScheme.getNumberOfXTilesAtLevel(0);
        var numberOfLevelZeroTilesY = tilingScheme.getNumberOfYTilesAtLevel(0);
        var result = new Array(numberOfLevelZeroTilesX * numberOfLevelZeroTilesY);
        var i = 0;
        for (var x = 0; x < numberOfLevelZeroTilesX; x++) {
            for (var y = 0; y < numberOfLevelZeroTilesY; y++) {
                result[i++] = new QuadtreeTile({
                    tilingScheme: tilingScheme,
                    x: x,
                    y: y,
                    level: 0,
                });
            }
        }
        return result;
    };
    return QuadtreeTile;
}());
exports.QuadtreeTile = QuadtreeTile;
