<?php
require_once('freteutils.php');
class ModelShippingDlog extends FreteUtils {
	function getQuote($address, $pProduct = Array()) {
    $this->load->type('tipocomum');
    $this->load->type('tipofrete');
    $this->load->helper('ftr_geral');

    //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('dlog_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('dlog_geo_zone_id')) {
        $status = true;
      } elseif ($query->num_rows) {
        $status = true;
      } else {
        $status = false;
      }
    }

    $method_data = array();
    $volumesList = array();

		if ($status) {
      $this->setUnidadesMedida();
      $cepEnvio = str_replace('-','',$address['postcode']);
      try{
        if(sizeof($pProduct) > 0){
          $products  = $pProduct;
          $peso      = 0;
          $valPedido = 0;
          foreach($pProduct as $prod){
            $peso       += $prod['weight'];
            $valPedido  += $prod['price'] * $prod['quantity'];
          }
        }else{
          $products  = $this->cart->getProducts();
          $peso      = $this->cart->getWeight();
          $valPedido = $this->cart->getSubTotal();
        }

        if (!$this->config->get('dlog_simular_caixa')){
          $cost = 0;
          $qtd = 0;
          $largura = 0;
          $altura = 0;
          $comprimento = 0;
          foreach ($products as $prod) {
              $prod['width'] = $prod['width']*$prod['quantity'];
              if($largura < $prod['length']){
                  $largura = $prod['length'];
              }
              if($altura<$prod['height']){
                  $altura = $prod['height'];
              }
              $comprimento += $prod['width'];
          }
          $dataSend = array(
            "vPed"  => $valPedido,
            "peso"  => $peso,
            "compr" => $comprimento,
            "larg"  => $largura,
            "alt"   => $altura,
            "cep"   => $cepEnvio,
            "Format"=> "json",
            "ICMS"  => $this->config->get('dlog_icms')
          );

          $volumesList[] = array(
            'weight'  => $peso,
            'width'   => $largura,
            'height'  => $altura,
            'lenght'  => $comprimento,
            'cost_of_goods' => $valPedido
          );

          if ($this->config->get('dlog_modal_service') <> Type_DlogModalService::Tp_DlgModalTodos){
            $dataSend = array_merge($dataSend,array("modal" => $this->config->get('dlog_modal_service')) );
          }
          $data = $this->dlog->getQuote($dataSend);
        }else{
          $caixas = $this->organizarEmCaixas($products);
          
          foreach ($caixas as $caixa){
            $dataSend = array(
              "vPed"  => $this->getTotalCaixa($caixa['produtos']),
              "peso"  => $caixa['weight'],
              "compr" => $caixa['length'],
              "larg"  => $caixa['width'],
              "alt"   => $caixa['height'],
              "cep"   => $cepEnvio,
              "Format"=> "json",
              "ICMS"  => $this->config->get('dlog_icms')
            );

            $volumesList[] = array(
              'weight'  => $caixa['weight'],
              'width'   => $caixa['width'],
              'height'  => $caixa['height'],
              'lenght'  => $caixa['length'],
              'cost_of_goods' => $this->getTotalCaixa($caixa['produtos'])
            );

            if ($this->config->get('dlog_modal_service') <> Type_DlogModalService::Tp_DlgModalTodos){
              $dataSend = array_merge($dataSend,array("modal" => $this->config->get('dlog_modal_service')) );
            }

            $result = $this->dlog->getQuote($dataSend);

            if (is_array($result)) {

              foreach ($result as $frete){
                //Faz a somatória dos totais de frete das caixas
                //Pega o maior prazo de entraga, não soma(óbvio) porque serão enviados juntos então...
                if (isset($frete['nomeTabela'])){
                  $index = $frete['nomeTabela'];
                  $frete_caixa[$index]['empresa'] = $frete['nomeTabela'];

                  if ($this->config->get('dlog_icms') == Type_Status::Tp_Habilitado){
                    $frete_caixa[$index]['valor'] = $frete['freteTotalComImposto'];
                  }else{
                    $frete_caixa[$index]['valor'] = $frete['freteTotal'];
                  }
                  
                  $frete_caixa[$index]['prazo'] = $frete['prazo'];
                }
              }

            }
          }
          
          if (isset($frete_caixa) && is_array($frete_caixa)) {
            foreach ($frete_caixa as $frete){
              //Monta o array igual ao que retorna da $this->dlog->getQuote(), para não fazer mais validação ao montar quote_data.
              $data[] = array(
                "nomeTabela"     => $frete['empresa'],
                "prazo"       => $frete['prazo'],
                $this->config->get('dlog_icms') == Type_Status::Tp_Habilitado ? 
                  "freteTotalComImposto" : 
                  "freteTotal" => $frete['valor']
              );       
            }
          }
        }

        if (isset($data) && is_array($data)) {
          foreach ($data as $frete){
            $prazo_entrega = $frete['prazo'];
            if($this->config->get('dlog_prazo_extra')>0){
              $prazo_entrega = $prazo_entrega + $this->config->get('dlog_prazo_extra');
            }
            $prazo_entrega_text = '- Previsão: ' . $prazo_entrega .' dias uteis.';

            if($this->config->get('dlog_icms') == Type_Status::Tp_Habilitado){
              $vlfrete = $frete['freteTotalComImposto'];
            }else{
              $vlfrete = $frete['freteTotal'];
            }

            if($this->config->get('dlog_valor_extra')>0){
              $vlfrete = $vlfrete + $this->config->get('dlog_valor_extra');
            }

            $quote_data[$frete['nomeTabela']] = array(
              'code'         => 'dlog.'.$frete['nomeTabela'],
              'title'        => $frete['nomeTabela'] . ' ' . $prazo_entrega_text,
              'cost'         => round((float)$vlfrete, 2, PHP_ROUND_HALF_UP),
              'days'         => $prazo_entrega,
              'text'         => $this->currency->format($vlfrete),
              'volumes_info' => $volumesList
            );
          }

          $method_data = array(
            'code'       => 'dlog',
            'title'      => $this->config->get('dlog_descricao'),
            'quote'      => $quote_data,
            'sort_order' => $this->config->get('dlog_sort_order'),
            'error'      => false
          );
        }
      }catch (Exception $e){
        $logData = [
            'event'    => 'ShippingDlog::getQuote',
            'exception'=> [
                'type'    => get_class($e),
                'message' => $e->getMessage(),
                'code'    => $e->getCode(),
                'file'    => $e->getFile(),
                'line'    => $e->getLine(),
                'trace'   => $e->getTraceAsString()
            ],
            'datetime' => date('c'), // data/hora no padrão ISO
        ];
        $this->log->write(json_encode($logData, JSON_UNESCAPED_UNICODE));
      }

    }
		return $method_data;
	}


}
