<?php
class ModelShippingJamef extends Model {
	function getQuote($address, $pProduct = Array()) {

		$this->load->type('tipocomum');

    //feito a principio para skyhub Frete, mais pode ser utilizado para qualquer frete que
    //não tenha informações do estado...
    if((!$address['zone_id']) && ($address['layout_id'] == Type_SendPostcode::Tp_Product)){
      $status = true;
    }else {
      $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "zone_to_geo_zone WHERE geo_zone_id = '" . (int)$this->config->get('jamef_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('jamef_geo_zone_id')) {
        $status = true;
      } elseif ($query->num_rows) {
        $status = true;
      } else {
        $status = false;
      }
    }

		$method_data = array();

		if ($status) {
		  try{
                    $soaptimeoutini = ini_get('default_socket_timeout');

                    ini_set('default_socket_timeout', 5);//timeout de 4 segundos pra não travar a conexão...
    		    $client = new SoapClient('https://www.jamef.com.br/webservice/JAMW0520.apw?WSDL');
                    ini_set('default_socket_timeout', $soaptimeoutini);//volta o timeout do php default...
                //////Retorno Valor do frete

    		    $function = 'JAMW0520_05';

    		    if(sizeof($pProduct) > 0){
    		      $produtos = $pProduct;

              $produtoPeso = 0;
              $produtoVal  = 0;
              $produtoQtd  = 0;
              foreach ($produtos as $product) {
                $produtoPeso += $product['weight'];
                $produtoVal  += $product['price'] * $product['quantity'];
                $produtoQtd  += $product['quantity'];
              }
              $produtoPeso  = number_format($produtoPeso,2,'.','');
              $produtoVal   = number_format($produtoVal,2,'.','');

            }else{
              $produtos     = $this->cart->getProducts();
              $produtoPeso  = number_format($this->cart->getWeight(),2,'.','');
              $produtoQtd   = $this->cart->countProducts();
              $produtoVal   = number_format($this->cart->getSubTotal(),2,'.','');
            }

            $produtoCubic = $this->getCubic($produtos);

    		    $arguments= array('JAMW0520_05' => array(
    		        'TIPTRA'   	=> 1, ///Rodoviario
    		        'CNPJCPF'   => $this->config->get('jamef_cnpj'),
    		        'MUNORI'    => $this->config->get('jamef_municipioOrigem'),
    		        'ESTORI'	=> $this->config->get('jamef_ufOrigem'),
    		        'MUNDES2'   => '',
    		        'ESTDES2'   => '',
    		        'SEGPROD'   => $this->config->get('jamef_tipoProduto'),
    		        'QTDVOL' 		=> $produtoQtd,
    		        'PESO'      => $produtoPeso,
    		        'VALMER'    => $produtoVal,
    		        'METRO3'    => $produtoCubic,
    		        'CNPJDES'   => '',
    		        'FILCOT'    => $this->config->get('jamef_filial'),
    		        'CEPDES'    => $address['postcode']
    		    ));
    		    $options = array('location' => 'https://www.jamef.com.br/webservice/JAMW0520.apw');
    		    $retornovalfrete = $client->__soapCall($function, $arguments, $options);
    		    ////////////

    		    ////////Retorna prazo de entrega
    		    $function = 'JAMW0520_04';

    		    $data = date("d/m/Y");

    		    $arguments= array('JAMW0520_04' => array(
    		        'TIPTRA'   	=> 1,
    		        'MUNORI'    => $this->config->get('jamef_municipioOrigem'),
    		        'ESTORI'    => $this->config->get('jamef_ufOrigem'),
    		        'MUNDES2'	=> '',
    		        'ESTDES2'   => '',
    		        'CNPJCPF'   => $this->config->get('jamef_cnpj'),
    		        'CDATINI'   => $data,
    		        'CHORINI' 	=> date("H:i"),
    		        'CEPDES'    => $address['postcode']
    		    ));
    		    $options = array('location' => 'https://www.jamef.com.br/webservice/JAMW0520.apw');
    		    $retornaprazo = $client->__soapCall($function, $arguments, $options);
    		    ////////////



            $datasemfomato = $this->date_converter($retornaprazo->JAMW0520_04RESULT->CDTMAX);


            if ($this->config->get('jamef_periodoadicional') > 0){
                //$prazoentrega = date('d/m/Y',strtotime($datasemfomato));
                //$prazoentrega = date('d/m/Y', strtotime($datasemfomato. '+'.$this->config->get('jamef_periodoadicional').' days')); //$retornaprazo->JAMW0520_04RESULT->CDTMAX;
                $datajamef = new DateTime(date('Y/m/d',strtotime($datasemfomato)));
                $dataatual = new DateTime(date('Y/m/d'));
                $daysEntrega = date_diff($dataatual, $datajamef);//$datetime1->diff( $datetime2 ) + $this->config->get('jamef_periodoadicional');
                $daysEntrega = $daysEntrega->days+ $this->config->get('jamef_periodoadicional');

            }
            else {
                $datajamef = new DateTime(date('Y/m/d',strtotime($datasemfomato)));
                $dataatual = new DateTime(date('Y/m/d'));
                $daysEntrega = date_diff($dataatual, $datajamef);
                $daysEntrega = $daysEntrega->days;
            }

            if ($this->config->get('jamef_exibeprevisao')){

                $prazoentrega = 'Jamef - Previsão: Até ' . $daysEntrega .' dias.';
            }
            else {
              $prazoentrega = $this->config->get('jamef_nome');
            }


            if(is_numeric(strpos($retornovalfrete->JAMW0520_05RESULT->MSGERRO,'Ok -'))) {
                $allValues = $retornovalfrete->JAMW0520_05RESULT->VALFRE->AVALFRE;
                $vlfrete = 0.0;
                foreach($allValues as $value) {
                    $value->COMPONENTE = trim($value->COMPONENTE);
                    if($value->COMPONENTE == 'TF-TOTAL DO FRETE') {
                        $vlfrete += (float)trim($value->TOTAL);
                        break;
                    }
                }


                $vlfrete = str_replace(',','.',$vlfrete);


              if ($vlfrete>0) {

                  $quote_data['jamef'] = array(
                      'code'         => 'jamef.jamef',
                      'title'        => $prazoentrega,
                      'days'         => $daysEntrega,
                      'cost'         => round((float)$vlfrete, 2, PHP_ROUND_HALF_UP),
                      'text'         => $this->currency->format($vlfrete)
                    );

                    $method_data = array(
                      'code'       => 'jamef',
                      'title'      => $this->config->get('jamef_nome'),
                      'quote'      => $quote_data,
                      'sort_order' => $this->config->get('jamef_sort_order'),
                      'error'      => false
                    );
              }
            }

		  }catch (SoapFault $fault){
                      ini_set('default_socket_timeout', $soaptimeoutini);//volta o timeout do php default...
		      //Não é para exibir o erro mesmo, isso valida o webservice se der erro não trava os demais módulos
		      //echo  '<div style="font-size:11px; margin-bottom:3px">*Forma de envio da Jamef Indisponivel no momento.</div>';

		  }
		}
		return $method_data;
	}

	public function CmToM($valor){
	return $valor/100;
	}

	public function Limpar($st){
	$st = str_replace('-','',$st);
	$st = str_replace(' ','',$st);
	$st = str_replace('.','',$st);
	return $st;
	}

	public function getCubic($products) {
      $cubic = 0;
       foreach ($products as $product) {
            $cubic += ($this->CmToM($product['length']) * $this->CmToM($product['width']) * $this->CmToM($product['height'])) * $product['quantity'];
       }
	  $cubic = number_format($cubic,4,'.','');
      return $cubic;
   }

   public function date_converter($_date = null) {
       $format = '/^([0-9]{2})\/([0-9]{2})\/([0-9]{2})$/';
       if ($_date != null && preg_match($format, $_date, $partes)) {
           return $partes[3].'-'.$partes[2].'-'.$partes[1];
       }
       return false;
   }

}
