/**
 * @author mrdoob / http://mrdoob.com/
 */

THREE.KMZLoader = function ( manager ) {

	this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;

};

THREE.KMZLoader.prototype = {

	constructor: THREE.KMZLoader,

	load: function ( url, onLoad, onProgress, onError ) {

		var scope = this;

		var loader = new THREE.FileLoader( scope.manager );
		loader.setResponseType( 'arraybuffer' );
		loader.load( url, function ( text ) {

			onLoad( scope.parse( text ) );

		}, onProgress, onError );

	},

	parse: function ( data ) {

		var zip = new JSZip( data ); // eslint-disable-line no-undef

		// console.log( zip );

		// var xml = new DOMParser().parseFromString( zip.file( 'doc.kml' ).asText(), 'application/xml' );

		function loadImage( image ) {

			var path = decodeURI( image.init_from );

			// Hack to support relative paths
			path = path.replace( '../', '' );

			var regex = new RegExp( path + '$' );
			var files = zip.file( regex );

			// console.log( image, files );

			if ( files.length ) {

				var file = files[ 0 ];
				var blob = new Blob( [ file.asArrayBuffer() ], { type: 'application/octet-binary' } );
				image.build.src = URL.createObjectURL( blob );

			}

		}

		// load collada

		var files = zip.file( /dae$/i );

		if ( files.length ) {

			var file = files[ 0 ];

			var collada = new THREE.ColladaLoader().parse( file.asText() );

			// fix images

			var images = collada.library.images;

			for ( var name in images ) {

				loadImage( images[ name ] );

			}

			return collada;

		}

		console.error( 'KMZLoader: Couldn\'t find .dae file.' );

		return {
			scene: new THREE.Group()
		};

	}

};
