<?php
class ModelShippingIfieldSimuleFrete extends Model {
	function getQuote($address) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "zone_to_geo_zone WHERE geo_zone_id = '" . (int)$this->config->get('ifield_geo_zone_id') . "' AND country_id = '" . (int)$address['country_id'] . "' AND (zone_id = '" . (int)$address['zone_id'] . "' OR zone_id = '0')");

		if (!$this->config->get('ifield_geo_zone_id')) {
			$status = true;
		} elseif ($query->num_rows) {
			$status = true;
		} else {
			$status = false;
		}

		$method_data = array();

		if ($status) {

			$cost = 0;
			$produtos = $this->cart->getProducts();
			//$qtd = 0;
			//$profundidade = 0;
			//$altura = 0;
			//$comprimento = 0;
			$medidasCorretas = true;
			$metrosCubicos = 0;
			
			

			foreach ($produtos as $prod) {
				$ItemCubado = 0;
				If ($prod['width'] <= 0 || $prod['length'] <= 0 || $prod['height'] <=0){
					$medidasCorretas = false; //Se qualquer produto estiver sem alguma medida, não deverá exibir o frete pois ira calcular errado.
				}
				$prodquantidade = $prod['quantity'] - 1;
				if (($prod['comp_progressiva'] > 0) || ($prod['larg_progressiva'] >0) || ($prod['alt_progressiva'] > 0)&&($prod['quantity']>1)){
					$prod['height'] = $prod['height'] +(($prodquantidade)*$prod['alt_progressiva']);
					$prod['length'] = $prod['length'] +(($prodquantidade)*$prod['comp_progressiva']);
					$prod['width']  = $prod['width'] +(($prodquantidade)*$prod['larg_progressiva']);
					$prod['quantity'] = 1; // caso o produto seja empilhado, seta para um pois ira adicionalo como se fosse uma unidade na caixa
				}	
				$ItemCubado = (($prod['width']/100) * ($prod['length']/100) * ($prod['height']/100))*$prod['quantity'];
				/*	
				$prod['width']  = $prod['width']*$prod['quantity'];
				$prod['length'] = $prod['length']*$prod['quantity'];
				$prod['height'] = $prod['height']*$prod['quantity'];
				if($profundidade<$prod['length']){
						$profundidade += $prod['length'];
				}
				if($altura<$prod['height']){
						$altura += $prod['height'];
				}
				$profundidade += $prod['length'];
				$altura += $prod['height'];
				$comprimento += $prod['width'];
				*/
				$metrosCubicos += $ItemCubado;
				
			}
			//$cubagem = ($altura*$comprimento*$profundidade); //3333 Fator de cubagem terrestre

			//Gerando autorização - Inicio
			$autorizacao = $information_data = $this->cache->get('autorizacaoIField'); 
			if (!$autorizacao){
				$curlAuth = curl_init();
				if ($this->config->get('ifield_modoTeste')){
					curl_setopt($curlAuth, CURLOPT_URL,"https://sandbox-api.ifieldlogistics.com/v1/auth");
				}else{
					curl_setopt($curlAuth, CURLOPT_URL,"https://api.ifieldlogistics.com/v1/auth");
				}
				curl_setopt($curlAuth, CURLOPT_POST, 1);
				curl_setopt($curlAuth, CURLOPT_POSTFIELDS, ["clientTokenApi" => $this->config->get('ifield_tokenAPI')]);
				curl_setopt($curlAuth, CURLOPT_RETURNTRANSFER, true);
				curl_setopt($curlAuth, CURLOPT_SSL_VERIFYPEER, 0);
				curl_setopt($curlAuth, CURLOPT_SSL_VERIFYHOST, 0);
				$auth = curl_exec($curlAuth);
				if($auth === false) {
					$this->log->write('Curl error: ' . curl_error($curlAuth));
				}
				$httpInfo = curl_getinfo($curlAuth, CURLINFO_HTTP_CODE);
				curl_close ($curlAuth);
				$authResult = json_decode($auth);
				if (isset($authResult->authToken)){
					$autorizacao = $authResult->authToken;
					$this->cache->set('autorizacaoIField', $autorizacao, 43200 /* valor em segundos(12 horas) */);
				}else{
					$autorizacao = false;
				}

			
			}
			//Gerando autorização - Fim

			if ($autorizacao){
				$curlDadosEnvio = [
				    'originZipcode'                 =>  $this->config->get('ifield_cepOrigem'),
				    'destinationZipcode'            =>  $address['postcode'],
				    'documentReceiver'              =>  $this->customer->getCnpj(),
				    'grossValue'                    =>  number_format($this->cart->getTotal(), 2),

				    //PARA A MAIORIA DOS CASOS, UTILIZE O TOTAL
				    'calculationType'               =>  $this->config->get('ifield_tipoCalculo'),
				    'totalWeight'                   =>  $this->cart->getWeight(),
				    'cubicMeter'                    =>  $metrosCubicos,
				    'orderDate'                     =>  date('Y-m-d'),
				    //...
						'haulersLimit' 	                => $this->config->get('ifield_limiteTransportadora'),
						'sortBy' 	                			=> $this->config->get('ifield_ordenacaoFrete')
				];

				$soaptimeoutini = ini_get('default_socket_timeout');
				ini_set('default_socket_timeout', 5);//timeout de 4 segundos pra não travar a conexão...

				$curl = curl_init();

				if ($this->config->get('ifield_modoTeste')){
					curl_setopt($curl, CURLOPT_URL,"https://sandbox-api.ifieldlogistics.com/simulefrete/v1/customer/freight/calculateFreights/?".http_build_query($curlDadosEnvio));
				}else{
					curl_setopt($curl, CURLOPT_URL,"https://api.ifieldlogistics.com/v1/customer/freight/calculateFreights/?".http_build_query($curlDadosEnvio));
				}

				curl_setopt($curl, CURLOPT_HTTPHEADER, ["Content-Type:application/json", "Authorization: Bearer ".$autorizacao]);
				curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
				curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
				curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);

				$crResult = curl_exec($curl);
				curl_close ($curl);

				$dataIFild = json_decode($crResult); 
				
				if ($medidasCorretas && isset($dataIFild->pricingHaulerList)){
					$quote_data = array();
					foreach ($dataIFild->pricingHaulerList as $transportadora) {
						if ($this->config->get('ifield_diasAdicionais')){
							$previsaoEntrega = $transportadora->deliveryTimeFreight+$this->config->get('ifield_diasAdicionais');
						}else{
							$previsaoEntrega = $transportadora->deliveryTimeFreight;
						}

						$codeName = str_replace(" ","_",preg_replace("/&([a-z])[a-z]+;/i", "$1", htmlentities(trim($transportadora->tradeHauler))));
						
						$descricao = $transportadora->tradeHauler.' -  Entrega em aproximadamente '.$previsaoEntrega.' dias uteis.';

						if ($this->config->get('ifield_percentualAcrescimo')){
							$precoFrete = $transportadora->priceFreight+(($transportadora->priceFreight*$this->config->get('ifield_percentualAcrescimo'))/100);
						}else{
							$precoFrete = $transportadora->priceFreight;
						}
						if ($precoFrete > 0){
			    		$quote_data[$codeName] = array(
			      		'code'         => 'iFieldSimuleFrete.'.$codeName,
			      		'title'        => $descricao,
			      		'cost'         => $precoFrete,
			      		'tax_class_id' => 0,
								'text'         => $this->currency->format($transportadora->priceFreight)
			    		);
						}
					}
					if (count($quote_data)>0){
			  		$method_data = array(
			    		'code'       => 'iFieldSimuleFrete',
			    		'title'      => $this->config->get('ifield_title'),
			    		'quote'      => $quote_data,
							'sort_order' => $this->config->get('iField_sort_order'),
			    		'error'      => false
			  		);
					}
				}
			}
		}	
		return $method_data;
	}
}
?>
