<?php
class Controllerskyhubskyfrete extends Controller
{

  /*Exemplo de request:
  {
    "destinationZip": 22041001,
    "volumes": [
      {
        "sku": "SKU_PARCEIRO_1",
        "quantity": 2,
        "price": 15.20,
        "height": 0.55,
        "length": 0.63,
        "width": 0.21,
        "weight": 1.00
      },
      {
        "sku": "SKU_PARCEIRO_2",
        "quantity": 1,
        "price": 53.99,
        "height": 0.3,
        "length": 0.2,
        "width": 0.1,
        "weight": 1.75
      }
    ]
  }
  */
  //Necessário consultar CEP para validações de região de entrega...
  public function getAddressData($postCode){
    /* Desativado porque o tempo de resposta desse recurso nunca da menos de 800ms
     * tempo máximo que essa api deve responder para ser considerada...
    $this->load->dmodel('localisation/zone');
    $this->load->dmodel('localisation/country');

    //$state_zone_id = 458;
    //$city = "Rio De Janeiro";
    //$address_1 = "Avenida Atlântica";
    //$address_2 = "Copacabana";

    $postCode = str_replace('-', '', $postCode);

    $results = $this->cep->getCep($postCode);
    if ($results) {
      foreach ($results as $key => $result) {

        if (!empty(trim($result['uf']))) {
          $state_zone_id = $this->dmodel_localisation_zone->getZoneIdByUf($result['uf']);

        }

        if (!empty(trim($result['cidade']))) {
          $city = ucwords(mb_strtolower($result['cidade']));
        }

        if (!empty(trim($result['logradouro_completo']))) {
          $address_1 = ucwords(mb_strtolower($result['logradouro_completo']));
        }

        if (!empty(trim($result['bairro']))) {
          $address_2 = ucwords(mb_strtolower($result['bairro']));
        }
      }
    }else{
      return false;
    }

    $country_id         = Type_PaisId::Tp_Brasil;
    $zone_info          = $this->dmodel_localisation_zone->getZone($state_zone_id);
    $country_info       = $this->dmodel_localisation_country->getCountry($country_id);
    $country            = $country_info['name'];
    $iso_code_2         = $country_info['iso_code_2'];
    $iso_code_3         = $country_info['iso_code_3'];
    $address_format     = $country_info['address_format'];


    if ($zone_info) {
      $zone      = $zone_info['name'];
      $zone_code = $zone_info['code'];
    } else {
      $zone      = '';
      $zone_code = '';
    }
    $address_data = array(
      'firstname'      => '',
      'lastname'       => '',
      'company'        => '',
      'address_1'      => $address_1,
      'address_2'      => $address_2,
      'postcode'       => $postCode,
      'city'           => $city,
      'zone_id'        => $state_zone_id,
      'zone'           => $zone,
      'zone_code'      => $zone_code,
      'country_id'     => $country_id,
      'country'        => $country,
      'iso_code_2'     => $iso_code_2,
      'iso_code_3'     => $iso_code_3,
      'address_format' => $address_format,
      'layout_id'			 => Type_SendPostcode::Tp_Cart
    );
    return $address_data;*/
    $this->load->dmodel('localisation/country');
    $country_id         = Type_PaisId::Tp_Brasil;
    $country_info       = $this->dmodel_localisation_country->getCountry($country_id);
    $country            = $country_info['name'];
    $iso_code_2         = $country_info['iso_code_2'];
    $iso_code_3         = $country_info['iso_code_3'];
    $address_format     = $country_info['address_format'];

    $address_data = array(
      'postcode'       => $postCode,
      'country_id'     => $country_id,
      'country'        => $country,
      'iso_code_2'     => $iso_code_2,
      'iso_code_3'     => $iso_code_3,
      'address_format' => $address_format,
      'zone_id'        => false,
      'layout_id'			 => Type_SendPostcode::Tp_Product
    );
    return $address_data;
  }

  public function calcularFrete(){
    $this->load->model('catalog/product');
    $this->load->model('setting/extension');
    $this->load->helper('ftr_geral');

    $retorno   = Array();
    $httpCode  = false;
    $blockCalc = false;

    $dadosRequest = json_decode(file_get_contents("php://input"), true);

    if(sizeof($dadosRequest) <= 0){
      $blockCalc = true;
    }

    if(!$blockCalc) {
      $address_data = $this->getAddressData($dadosRequest['destinationZip']);
      if ($address_data) {

        $produtos = array();
        foreach ($dadosRequest['volumes'] as $dreq) {

          if(strtoupper(substr($dreq['sku'], 0, 1)) == 'G'){
            //Bloqueia o cálculo porque não foi implementado o cálculo direto na grade...
            //não sei se pode ter esse caso, então por precaução estou validando aqui pra não cálcular...
            $blockCalc = true;
            break;
          }

          $product_id = substr($dreq['sku'], 1, strlen($dreq['sku']) -1);

          $product_aux = $this->model_catalog_product->getProduct($product_id);


          if ($product_aux) {
            $product_aux['total']     = $dreq['quantity'] * $dreq['price'];
            $product_aux['quantity']  = $dreq['quantity'];
            $product_aux['price']     = $dreq['price'];
            $product_aux['height']    = ftr_geral::MetrosToCm($dreq['height']);
            $product_aux['length']    = ftr_geral::MetrosToCm($dreq['length']);
            $product_aux['width']     = ftr_geral::MetrosToCm($dreq['width']);
            $product_aux['weight']    = $dreq['weight'];

            $produtos[$product_aux['product_id']] = $product_aux;
          } else {
            //Bloqueia o cálculo porque algum dos produtos não foram identificados no sistema anexados...
            $blockCalc = true;
            break;
          }
        }

        if (!$blockCalc) {

          $results = $this->model_setting_extension->getExtensions('shipping');

          foreach ($results as $result) {
            if (($this->config->get($result['code'] . '_status')) && (!is_null(TypeSkyHub_FreteEstrutMerc::getConstFromNickValue($result['code'])))) {

              $this->load->model('shipping/' . $result['code']);
              $quote = $this->{'model_shipping_' . $result['code']}->getQuote($address_data, $produtos);

              if ($quote) {
                foreach ($quote['quote'] as $qt) {
                  if (isset($qt['days']) && ((int)$qt['days'] > 0)) {
                    //Os módulos calculam independente seus dias adcionais, então
                    //coloco 1 como expedição apenas para enviar a informação...
                    $totalShipping  = $qt['days'];
                    $transit        = $qt['days'] - 1;
                    $expedition     = 1;

                    $deliveryTime = array(
                      "total"      => $totalShipping,
                      "transit"    => $transit,
                      "expedition" => $expedition
                    );

                    $retorno['shippingQuotes'][] = array(
                      'shippingCost'              => $qt['cost'],
                      'deliveryTime'              => $deliveryTime,
                      'shippingMethodId'          => $qt['code'],
                      'shippingMethodName'        => $qt['title'],
                      'shippingMethodDisplayName' => $qt['title'],
                    );
                  }
                }
              }
            }
          }
        }
      }
    }

    if(!array_key_exists('shippingQuotes', $retorno)){
      $retorno['message'] = "Região de entrega não atendida";
      $httpCode = 404;//404 conforme documentação da skyhub em caso de frete não informado...
    }
    $this->response->setOutputJson($retorno, $httpCode);
  }


}