/// <reference path="./Layer.d.ts" />

declare module 'guacamole-client' {
  /**
   * Simple container for Guacamole.Layer, allowing layers to be easily
   * repositioned and nested. This allows certain operations to be accelerated
   * through DOM manipulation, rather than raster operations.
   * @param width The width of the Layer, in pixels. The canvas element backing this Layer will be given this width.
   * @param height The height of the Layer, in pixels. The canvas element backing this Layer will be given this height.
   */
  class VisibleLayer extends Layer {
    constructor(width: number, height: number);

    /**
     * The opacity of the layer container, where 255 is fully opaque and 0 is
     * fully transparent.
     */
    alpha: number;

    /**
     * X coordinate of the upper-left corner of this layer container within
     * its parent, in pixels.
     * @default 0
     */
    x: number;

    /**
     * Y coordinate of the upper-left corner of this layer container within
     * its parent, in pixels.
     * @default 0
     */
    y: number;

    /**
     * Z stacking order of this layer relative to other sibling layers.
     * @default 0
     */
    z: number;

    /**
     * The affine transformation applied to this layer container. Each element
     * corresponds to a value from the transformation matrix, with the first
     * three values being the first row, and the last three values being the
     * second row. There are six values total.
     * @default [1, 0, 0, 1, 0, 0]
     */
    matrix: [number, number, number, number, number, number];

    /**
     * The parent layer container of this layer, if any.
     * @default null
     */
    parent: VisibleLayer | null;

    /**
     * Set of all children of this layer, indexed by layer index. This object
     * will have one property per child.
     * @default {}
     */
    children: Record<number, VisibleLayer | undefined>;

    /**
     * Returns the element containing the canvas and any other elements
     * associated with this layer.
     * @returns The element containing this layer's canvas.
     */
    getElement(): HTMLElement;

    /**
     * Moves the upper-left corner of this layer to the given X and Y coordinate.
     * @param x The X coordinate to move to.
     * @param y The Y coordinate to move to.
     */
    translate(x: number, y: number): void;

    /**
     * Moves the upper-left corner of this VisibleLayer to the given X and Y
     * coordinate, sets the Z stacking order, and reparents this VisibleLayer
     * to the given VisibleLayer.
     * @param parent The parent to set.
     * @param x The X coordinate to move to.
     * @param y The Y coordinate to move to.
     * @param z The Z coordinate to move to.
     */
    move(parent: VisibleLayer, x: number, y: number, z: number): void;

    /**
     * Sets the opacity of this layer to the given value, where 255 is fully
     * opaque and 0 is fully transparent.
     * @param a The opacity to set.
     */
    shade(a: number): void;

    /**
     * Removes this layer container entirely, such that it is no longer
     * contained within its parent layer, if any.
     */
    dispose(): void;

    /**
     * Applies the given affine transform (defined with six values from the
     * transform's matrix).
     * @param a The first value in the affine transform's matrix.
     * @param b The second value in the affine transform's matrix.
     * @param c The third value in the affine transform's matrix.
     * @param d The fourth value in the affine transform's matrix.
     * @param e The fifth value in the affine transform's matrix.
     * @param f The sixth value in the affine transform's matrix.
     */
    distort(a: number, b: number, c: number, d: number, e: number, f: number): void;
  }
}
