import {FullscreenEffect} from "./FullscreenEffect.js";

export class ThunderstormEffect extends FullscreenEffect
{
	static NAME = 'thunderstorm';

	constructor()
	{
		super();

		this.currentAlpha = 0.0;
		this.nextFlash = undefined;
		this.duration = 150;
		this.sounds = [
			new Audio('js/effects/thunder01.mp3'),
			new Audio('js/effects/thunder02.mp3'),
			new Audio('js/effects/thunder03.mp3'),
			new Audio('js/effects/thunder04.mp3'),
		];
		this.currentSound = 0;
		this.isActive = true;
	}

	shuffleSounds(iterations = 10)
	{
		const buffer = this.sounds.slice(0, this.sounds.length - 1);

		for (let i = 0; i < iterations; i++) {
			buffer.sort(
				(a, b) => {
					return 1 - Math.round(Math.random()) * 2
				}
			);
		}

		const index = 1 + Math.round(Math.random() * (buffer.length - 1));

		this.sounds = buffer.slice(0, index)
			.concat([this.sounds[this.sounds.length - 1]])
			.concat(buffer.slice(index));
	}

	update(timestamp)
	{
		super.update(timestamp);

		if (this.nextFlash > timestamp) {
			this.currentAlpha = 0.0;

			return;
		}

		if (timestamp < this.nextFlash + this.duration) {
			const progress = (timestamp - this.nextFlash) / this.duration;

			this.currentAlpha = Math.sin(Math.PI * progress) * 0.75;
		} else {
			const duration = 3000 + Math.round(Math.random() * 27000);

			this.nextFlash = timestamp + duration;

			setTimeout(
				() => {
					if (!this.isActive) {
						return;
					}

					if (this.currentSound === 0) {
						this.shuffleSounds();
					}

					this.sounds[this.currentSound].currentTime = 0;
					this.sounds[this.currentSound].play();

					this.currentSound = (this.currentSound + 1) % this.sounds.length;
				},
				duration + 1000
			);
		}
	}

	render(context, camera)
	{
		super.render(context, camera);

		if (this.currentAlpha === 0.0) {
			return;
		}

		context.fillStyle = 'rgba(255, 255, 255, ' + this.currentAlpha + ')';
		context.fillRect(0, 0, context.canvas.width, context.canvas.height);
	}

	destroy()
	{
		this.isActive = false;

		for (const sound of this.sounds) {
			sound.pause();
			sound.remove();
		}
	}
}
