// import * as Phaser from 'phaser';
import CanvasGameObjectBase from '../../../utils/types/CanvasGameObjectBase';

/**
 * Canvas-backed game object with texture update helpers.
 */
export default class Canvas extends CanvasGameObjectBase {
    /**
     * Create a canvas game object.
     * @param scene - The Scene to which this object belongs.
     * @param x - The x position.
     * @param y - The y position.
     * @param width - The canvas width.
     * @param height - The canvas height.
     * @param resolution - Canvas resolution.
     */
    constructor(
        scene: Phaser.Scene,
        x?: number, y?: number,
        width?: number, height?: number,
        resolution?: number,
    );

    /**
     * Current resolution value.
     */
    readonly resolution: number;
    /**
     * Set resolution.
     * @param resolution - Resolution value.
     * @returns This instance.
     */
    setResolution(resolution: number): this;

    /**
     * Canvas element.
     */
    canvas: HTMLCanvasElement;
    /**
     * Canvas 2D context.
     */
    context: CanvasRenderingContext2D;
    /**
     * Get the canvas element.
     * @param readOnly - True to return without marking dirty.
     * @returns The canvas element.
     */
    getCanvas(readOnly?: boolean): HTMLCanvasElement;
    /**
     * Get the canvas 2D context.
     * @param readOnly - True to return without marking dirty.
     * @returns The 2D context.
     */
    getContext(readOnly?: boolean): CanvasRenderingContext2D;

    /**
     * Set size of the game object.
     * @param width - Width value.
     * @param height - Height value.
     * @returns This instance.
     */
    setSize(width: number, height: number): this;
    /**
     * Resize the canvas.
     * @param width - Width value.
     * @param height - Height value.
     * @returns This instance.
     */
    resize(width: number, height: number): this;
    /**
     * Set the canvas size.
     * @param width - Width value.
     * @param height - Height value.
     * @returns This instance.
     */
    setCanvasSize(width: number, height: number): this;

    /**
     * Mark the canvas as needing redraw.
     * @returns This instance.
     */
    needRedraw(): this;
    /**
     * True if the canvas is dirty.
     */
    dirty: boolean;

    /**
     * Clear the canvas.
     * @returns This instance.
     */
    clear(): this;
    /**
     * Fill the canvas with a color.
     * @param color - Fill color.
     * @returns This instance.
     */
    fill(color: string): this;

    /**
     * Update the texture from the canvas.
     * @param callback - Optional draw callback.
     * @param scope - Callback scope.
     * @returns This instance.
     */
    updateTexture(
        callback?: (canvasElem: HTMLCanvasElement, context: CanvasRenderingContext2D) => void,
        scope?: object
    ): this;

    /**
     * Generate a texture from the canvas.
     * @param key - Texture key.
     * @param x - Source x.
     * @param y - Source y.
     * @param width - Source width.
     * @param height - Source height.
     * @returns This instance.
     */
    generateTexture(
        key: string | number,
        x?: number, y?: number,
        width?: number, height?: number
    ): this;

    /**
     * Load a texture into the canvas.
     * @param key - Texture key.
     * @param frame - Frame name.
     * @returns This instance.
     */
    loadTexture(
        key: string,
        frame?: string,
    ): this;

    /**
     * Draw a frame to the canvas.
     * @param key - Texture key.
     * @param frame - Frame name.
     * @param dx - Destination x.
     * @param dy - Destination y.
     * @param dWidth - Destination width.
     * @param dHeight - Destination height.
     * @param sxOffset - Source x offset.
     * @param syOffset - Source y offset.
     * @param sWidth - Source width.
     * @param sHeight - Source height.
     * @returns This instance.
     */
    drawFrame(
        key: string,
        frame?: string,
        dx?: number,
        dy?: number,
        dWidth?: number,
        dHeight?: number,
        sxOffset?: number,
        syOffset?: number,
        sWidth?: number,
        sHeight?: number,
    ): this;

    /**
     * Get canvas data URL.
     * @param type - Mime type.
     * @param encoderOptions - Encoder options.
     * @returns Data URL string.
     */
    getDataURL(
        type?: string,
        encoderOptions?: number
    ): string;

    /**
     * Get pixel color at a position.
     * @param x - X position.
     * @param y - Y position.
     * @returns The color.
     */
    getPixel(
        x: number, y: number
    ): Phaser.Display.Color;

    /**
     * Set pixel color at a position.
     * @param x - X position.
     * @param y - Y position.
     * @param r - Red value or color object.
     * @param g - Green value.
     * @param b - Blue value.
     * @param a - Alpha value.
     * @returns This instance.
     */
    setPixel(
        x: number, y: number,
        r: number | Phaser.Display.Color,
        g?: number,
        b?: number,
        a?: number
    ): this;

}
