// import {
// 	PlaneGeometry,
// 	ShaderMaterial,
// 	Uniform,
// 	Mesh,
// 	PerspectiveCamera,
// 	Scene,
// 	WebGLRenderer,
// 	Texture,
// 	SRGBColorSpace
// } from 'three';

let PlaneGeometry,
	ShaderMaterial,
	Uniform,
	Mesh,
	PerspectiveCamera,
	Scene,
	WebGLRenderer,
	Texture,
	SRGBColorSpace


let _renderer;
let fullscreenQuadGeometry;
let fullscreenQuadMaterial;
let fullscreenQuad;

export let setThreeAPI = (threeAPIObj) => {
	PlaneGeometry = threeAPIObj.PlaneGeometry
	ShaderMaterial = threeAPIObj.ShaderMaterial
	Uniform = threeAPIObj.Uniform
	Mesh = threeAPIObj.Mesh
	PerspectiveCamera = threeAPIObj.PerspectiveCamera
	Scene = threeAPIObj.Scene
	WebGLRenderer = threeAPIObj.WebGLRenderer
	Texture = threeAPIObj.Texture
	SRGBColorSpace = threeAPIObj.SRGBColorSpace
}

export function decompress(texture, maxTextureSize = Infinity, renderer = null) {

	if (!fullscreenQuadGeometry) fullscreenQuadGeometry = new PlaneGeometry(2, 2, 1, 1);
	if (!fullscreenQuadMaterial) fullscreenQuadMaterial = new ShaderMaterial({
		uniforms: { blitTexture: new Uniform(texture) },
		vertexShader: `
            varying vec2 vUv;
            void main(){
                vUv = uv;
                gl_Position = vec4(position.xy * 1.0,0.,.999999);
            }`,
		fragmentShader: `
            uniform sampler2D blitTexture; 
            varying vec2 vUv;

            void main(){ 
                gl_FragColor = vec4(vUv.xy, 0, 1);
                
                #ifdef IS_SRGB
                gl_FragColor = LinearTosRGB( texture2D( blitTexture, vUv) );
                #else
                gl_FragColor = texture2D( blitTexture, vUv);
                #endif
            }`
	});

	fullscreenQuadMaterial.uniforms.blitTexture.value = texture;
	fullscreenQuadMaterial.defines.IS_SRGB = texture.colorSpace == SRGBColorSpace;
	fullscreenQuadMaterial.needsUpdate = true;

	if (!fullscreenQuad) {

		fullscreenQuad = new Mesh(fullscreenQuadGeometry, fullscreenQuadMaterial);
		fullscreenQuad.frustrumCulled = false;

	}

	const _camera = new PerspectiveCamera();
	const _scene = new Scene();
	_scene.add(fullscreenQuad);

	if (!renderer) {

		renderer = _renderer = new WebGLRenderer({ antialias: false });

	}

	renderer.setSize(Math.min(texture.image.width, maxTextureSize), Math.min(texture.image.height, maxTextureSize));
	renderer.clear();
	renderer.render(_scene, _camera);

	const readableTexture = new Texture(renderer.domElement);

	readableTexture.minFilter = texture.minFilter;
	readableTexture.magFilter = texture.magFilter;
	readableTexture.wrapS = texture.wrapS;
	readableTexture.wrapT = texture.wrapT;
	readableTexture.name = texture.name;

	if (_renderer) {

		_renderer.dispose();
		_renderer = null;

	}

	return readableTexture;

}
