class HmAncestral {
	constructor (_dados) {
		if (_dados) {
			this.dados = _dados;
			var _this = this;
			Object.keys(_dados).forEach(
				function(_nomeObj) {
					_this[_nomeObj] = _dados[_nomeObj];
				});
			this.preparar();
			this.criar();
		}
	}
	
	get incluir(){
		return true;
	}

	preparar() {
	}

	criar() {
	}
	
}

function criarPastaObjeto3d(_pai, _guiPai, _nome) {
   _pai.controles = {
      pai: _pai,
      posicaoX: _pai.object3d.position.x,
      posicaoY: _pai.object3d.position.y,
      posicaoZ: _pai.object3d.position.z,
      rotacaoX: _pai.object3d.rotation.x,
      rotacaoY: _pai.object3d.rotation.y,
      rotacaoZ: _pai.object3d.rotation.z
   };
   var _folder = _guiPai.addFolder(_nome);
   _folder.posicao = _folder.addFolder("posição " + _nome);
   _folder.posicao.add(_pai.controles, 'posicaoX', -300, 300).onChange(function(e) {
      this.object.pai.controles.posicaoX = e;
      this.object.pai.object3d.position.x = e;
   });
   _folder.posicao.add(_pai.controles, 'posicaoY', -300, 300).onChange(function(e) {
      this.object.pai.controles.posicaoY = e;
      this.object.pai.object3d.position.y = e;
   });
   _folder.posicao.add(_pai.controles, 'posicaoZ', -300, 300).onChange(function(e) {
      this.object.pai.controles.posicaoZ = e;
      this.object.pai.object3d.position.z = e;
   });
   _folder.rotacao = _folder.addFolder("rotação " + _nome);
   _folder.rotacao.add(_pai.controles, 'rotacaoX', 0, 2 * Math.PI).onChange(function(e) {
      this.object.pai.controles.rotacaoX = e;
      this.object.pai.object3d.rotation.x = e;
   });
   _folder.rotacao.add(_pai.controles, 'rotacaoY', 0, 2 * Math.PI).onChange(function(e) {
      this.object.pai.controles.rotacaoY = e;
      this.object.pai.object3d.rotation.y = e;
   });
   _folder.rotacao.add(_pai.controles, 'rotacaoZ', 0, 2 * Math.PI).onChange(function(e) {
      this.object.pai.controles.rotacaoZ = e;
      this.object.pai.object3d.rotation.z = e;
   });
   return _folder;
}
class HmAncestralObject3d extends HmAncestral {
	constructor(_dados) {
		super(_dados);
	}
	
	classe() {
		return null;
	}

	// object3d = new THREE.Object3D();

	preparar() {
		super.preparar();
		this.object3d = new THREE.Object3D();
		//this.object3d = new THREE.Object3D();
	}

	criar() {
		super.criar();
		var classe = this.classe();
		if (classe) this.criarObjeto(classe);
		this.criarMalha();
	}

	criarGeometria() {
		return null;
	}

	criarMaterial() {
		return null;
	}

	criarMalha() {
		this.geometria = this.criarGeometria();
		this.material = this.criarMaterial();
		if (this.geometria && this.material)
			this.malha = this.criarObjetoMesh(new THREE.Mesh(this.geometria,this.material));
		return this.malha;
	}

	criarObjeto(_objeto,_vetor) {
		var _obj = (typeof _objeto === "function") ? new _objeto(this) : _objeto;
		this.object3d.add(_obj.object3d);
		if (_vetor) { _vetor.push(_obj); }
		return _obj;
	}

	criarObjetoMesh(_objeto,_vetor) {
		return this.criarObjeto({object3d: _objeto},_vetor);
	}

	interceptado(_x,_y) {
		return false;
	}
	
	vetorExternoInterceptado(_vetor,_x,_y) {
		this._vetor.find(function(_obj){return _obj.interceptado(_x,_y)});
	}
}
var HIPERMUSEU = {};

HIPERMUSEU.carregar = function(_url, _nomeArquivo) {
	var _hmHipermuseu = null;
	$.ajax({
		url: _url + "json/json-hipermuseu-01e.json" + _nomeArquivo,
		async: false,
		success: function(_configHipermuseu) {
		 _hmHipermuseu = new HmHipermuseu(_configHipermuseu);
		 _obj3D.hmHipermuseu = _hmHipermuseu;
		 _obj3D.cena.add(_hmHipermuseu.object3d);
		}
	});
	return _hmHipermuseu;
};

class HmHipermuseu extends HmAncestralObject3d {
	constructor(_configHipermuseu) {
		super({configHipermuseu: _configHipermuseu});
	}

	classe() {
		return HmMuseus;
	}

	preparar() {
		super.preparar();
		this.cfg = this.configHipermuseu;
		this.gui = (true || _obj3D.apresentarGUI) ? new dat.GUI() : null;
		if (this.cfg.ativar_luz_hemisferica) {
			this.luzHemisferica = this.criarObjeto(HmLuzHemisferica);
		}
		if (this.cfg.ativar_luz_ambiente) {
			this.luzAmbiente = this.criarObjeto(HmLuzAmbiente);
		}
		if (this.cfg.ativar_luz_direcional) {
			this.luzDirecional = this.criarObjeto(HmLuzDirecional);
		}
		if (this.cfg.ativar_chao) this.chao = this.criarObjeto(HmChao);
		if (this.cfg.ativar_ceu) this.ceu = this.criarObjeto(HmCeu);
	};
}
class HmAncestralObject3dVetor extends HmAncestralObject3d {
	constructor(_dados) {
		super(_dados);
	}

	preparar() {
		super.preparar();
		this.vetor = [];
	}

	criar () {
		var classe = this.classe();
		var cfg = this.cfg;
		if (cfg && classe) this.criarVetor(cfg,classe);
	}

	criarObjetoVetor(_objeto) {
		return this.criarObjeto(_objeto,this.vetor);
	}

	criarVetor(config,funcaoObjVetor) {
		var _this = this;
		config.forEach(
			function(_obj,_indice) {
				var _objVetor = new funcaoObjVetor(_this,_indice);
				if (_objVetor.incluir) _this.criarObjeto(_objVetor,_this.vetor);});
	}

	vetorInterceptado(vetor,_x,_y) {
		this.vetor.find(function(_obj){return _obj.quadroInterceptado(_x,_y)});
	}

}
class HmLuzHemisferica extends HmAncestralObject3d {
	constructor(_hipermuseu) {
		super({hipermuseu: _hipermuseu});
	}

	preparar() {
		super.preparar();
		this.cfg = this.hipermuseu.cfg.luz_hemisferica;
		this.gui = criarPastaObjeto3d(this,this.hipermuseu.gui,"luz hemisférica");
		//this.criarLuzHemisferica();
	}

	criar() {
		super.criar();
		var c = this.cfg;
		this.luz = this.criarObjetoMesh(new THREE.HemisphereLight(c.corCeu,c.corChao,c.intensidade)).object3d;
		/*
		this.luz = new THREE.HemisphereLight(
			this.cfg.corCeu,
			this.cfg.corChao,
			this.cfg.intensidade);
		this.object3d.add(this.luz);
		*/
		this.luz.color.setHSL(0.6, 1, 0.6);
		this.luz.groundColor.setHSL(0.095, 1, 0.75);
		this.luz.position.set(0, 500, 0);
	}
}