
import { Vector, VectorInteger } from "../../shared_js/class/Vector.js";
import { Component, GraphicComponent, Moving } from "../../shared_js/class/interface.js";
import { Rectangle, MovingRectangle, Racket, Ball } from "../../shared_js/class/Rectangle.js";
import { soundPongArr } from "../audio.js"
import { random } from "../utils.js";

function updateRectangle(this: RectangleClient) {
	this.ctx.fillStyle = this.color;
	this.ctx.fillRect(this.pos.x, this.pos.y, this.width, this.height);
}

function clearRectangle(this: RectangleClient, pos?: VectorInteger) {
	if (pos)
		this.ctx.clearRect(pos.x, pos.y, this.width, this.height);
	else
		this.ctx.clearRect(this.pos.x, this.pos.y, this.width, this.height);
}

class RectangleClient extends Rectangle implements GraphicComponent {
	ctx: CanvasRenderingContext2D;
	color: string;
	update: () => void;
	clear: (pos?: VectorInteger) => void;
	constructor(pos: VectorInteger, width: number, height: number,
			ctx: CanvasRenderingContext2D, color: string)
	{
		super(pos, width, height);
		this.ctx = ctx;
		this.color = color;
		this.update = updateRectangle;
		this.clear = clearRectangle;
	}
	// update() {
	// 	this.ctx.fillStyle = this.color;
	// 	this.ctx.fillRect(this.pos.x, this.pos.y, this.width, this.height);
	// }
	// clear(pos?: VectorInteger) {
	// 	if (pos)
	// 		this.ctx.clearRect(pos.x, pos.y, this.width, this.height);
	// 	else
	// 		this.ctx.clearRect(this.pos.x, this.pos.y, this.width, this.height);
	// }
}

class MovingRectangleClient extends MovingRectangle implements GraphicComponent {
	ctx: CanvasRenderingContext2D;
	color: string;
	update: () => void;
	clear: (pos?: VectorInteger) => void;
	constructor(pos: VectorInteger, width: number, height: number, baseSpeed: number,
			ctx: CanvasRenderingContext2D, color: string)
	{
		super(pos, width, height, baseSpeed);
		this.ctx = ctx;
		this.color = color;
		this.update = updateRectangle;
		this.clear = clearRectangle;
	}
}

class RacketClient extends Racket implements GraphicComponent {
	ctx: CanvasRenderingContext2D;
	color: string;
	update: () => void;
	clear: (pos?: VectorInteger) => void;
	constructor(pos: VectorInteger, width: number, height: number, baseSpeed: number,
			ctx: CanvasRenderingContext2D, color: string)
	{
		super(pos, width, height, baseSpeed);
		this.ctx = ctx;
		this.color = color;
		this.update = updateRectangle;
		this.clear = clearRectangle;
	}
}

class BallClient extends Ball implements GraphicComponent {
	ctx: CanvasRenderingContext2D;
	color: string;
	update: () => void;
	clear: (pos?: VectorInteger) => void;
	constructor(pos: VectorInteger, size: number, baseSpeed: number, speedIncrease: number,
		ctx: CanvasRenderingContext2D, color: string)
	{
		super(pos, size, baseSpeed, speedIncrease);
		this.ctx = ctx;
		this.color = color;
		this.update = updateRectangle;
		this.clear = clearRectangle;
	}
	bounce(collider?: Rectangle) {
		this._bounceAlgo(collider);
		soundPongArr[ Math.floor(random(0, soundPongArr.length)) ].play();
	}
	/* protected _bounceRacket(collider: Racket) {
		this._bounceRacketAlgo(collider);
		soundRoblox.play();
	} */
}

function updateLine(this: Line) {
	this.ctx.fillStyle = this.color;
	let pos: VectorInteger = new VectorInteger;
	let i = 0;
	while (i < this.segmentCount)
	{
		// for Horizontal Line
		// pos.y = this.pos.y;
		// pos.x = this.pos.x + this.segmentWidth * i;
		pos.x = this.pos.x;
		pos.y = this.pos.y + this.segmentHeight * i;
		this.ctx.fillRect(pos.x, pos.y, this.segmentWidth, this.segmentHeight);
		i += 2;
	}
}

class Line extends RectangleClient {
	gapeCount: number = 0;
	segmentCount: number;
	segmentWidth: number;
	segmentHeight: number;
	constructor(pos: VectorInteger, width: number, height: number,
			ctx: CanvasRenderingContext2D, color: string, gapeCount?: number)
	{
		super(pos, width, height, ctx, color);
		this.update = updateLine;
		if (gapeCount)
			this.gapeCount = gapeCount;
		this.segmentCount = this.gapeCount * 2 + 1;

		this.segmentWidth = this.width;
		this.segmentHeight = this.height / this.segmentCount;

		// for Horizontal Line
		// this.segmentWidth = this.width / this.segmentCount;
		// this.segmentHeight = this.height;
	}
}

export {RectangleClient, MovingRectangleClient, RacketClient, BallClient, Line}
