<?php
require_once('freteutils.php');

class ModelShippingMelhorenvio extends FreteUtils
{

    function getQuote($address, $pProduct = array())
    {
        $this->load->type('tipocomum');
        $this->load->type('tipofrete');
        $this->load->helper('ftr_geral');

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

        $method_data = array();

        if ($status) {
            $this->setUnidadesMedida();
            try {
                if (sizeof($pProduct) > 0) {
                    $products = $pProduct;
                } else {
                    $products = $this->cart->getProducts();
                }

                $dataSend = array();
                $dataSend['from']['postal_code'] = str_replace('-', '', $this->config->get('melhorenvio_postcode'));
                $dataSend['to']['postal_code'] = str_replace('-', '', $address['postcode']);

                // Frete por produto
                $this->load->dmodel('catalog/product');
                $this->load->model('catalog/category');
                foreach ($products as $product) {
                    if (isset($product['itens_kit']) && count($product['itens_kit'])>0) {
                        $modulostconf = $this->futuracalcularst->getconfiguracoes();
                        if ($modulostconf && ($this->customer->getTipo_pessoa() == 'J') && ($modulostconf['futuracalcularst_status']) ){
                            $itens_kit = $this->dmodel_catalog_product->getProductKitItens($product['product_kit_id'], true);
                        }else{
                            $itens_kit = $product['itens_kit'];
                        }

                        foreach ($itens_kit as $item_kit) {
                            $this->load->model('catalog/product');
                            $product_kit = $this->model_catalog_product->getProduct($item_kit['product_id']);
                            $dataSend['products'][] = array(
                                "id" => $product_kit['product_id'],
                                "width" => $product_kit['width'],
                                "height" => $product_kit['height'],
                                'length' => $product_kit['length'],
                                "weight" => $product_kit['weight_unit'] ?? $product_kit['weight'], // Se esta no carrinho ou na finalização de pedido, o campo chama weight_unit, se for na tela do produto chama weight
                                "insurance_value" => $item_kit['price'],
                                "quantity" => $item_kit['quantidade'] * $product['quantity'],
                            );
                        }
                    } else {
                        $dataSend['products'][] = array(
                            "id" => $product['product_id'],
                            "width" => $product['width'],
                            "height" => $product['height'],
                            "length" => $product['length'],
                            "weight" => $product['weight_unit'] ?? $product['weight'], // Se esta no carrinho ou na finalização de pedido, o campo chama weight_unit, se for na tela do produto chama weight
                            "insurance_value" => $product['price'],
                            "quantity" => $product['quantity'],
                        );
                    }
                }
                $fretes = $this->melhorenvio->getQuote(json_encode($dataSend));

                //Gambinhas pois quando vem apenas um frete ele retorna o objeto direto ao inves de um array de objetos. (Ai dava mil erros no "foreach" abaixo)
                $return = array();
                if(!is_array($fretes) && is_object($fretes)){
                    $return[] = $fretes;
                } else {
                    $return = $fretes;
                }

                // Após retorno
                foreach ($return as $itemQuote) {
                    if (is_object($itemQuote)) {
                        if (isset($itemQuote->error)) {
                            continue;
                        }

                        $prazoExtra = $this->config->get('melhorenvio_prazo_extra') ?? 0;
                        $valorExtra = $this->config->get('melhorenvio_valor_extra') ?? 0;
                        if (($itemQuote->custom_price > 0) && ($valorExtra > 0) && ($this->config->get('melhorenvio_tipo_valor_extra') == Type_AcrescimoDesconto::Tp_Porcentagem)) {
                            $valorExtra = $itemQuote->custom_price / 100 * $valorExtra;
                        }

                        $prazo = $itemQuote->custom_delivery_time + $prazoExtra;
                        $preco = $itemQuote->custom_price + $valorExtra;

                        $previsão = '';
                        if ($itemQuote->custom_delivery_time > 0) {
                            $previsão = ' - Previsão: ' . $prazo . ' dias úteis.';
                        }

                        if (strpos($itemQuote->name, $itemQuote->company->name) === false) {
                            $text = $itemQuote->company->name . ' (' . $itemQuote->name . ')';
                        } else {
                            $text = $itemQuote->name;
                        }

                        $volumesList = array();
                        foreach ($itemQuote->packages as $vol){
                            if(is_object($vol)){
                                $volumesList[] = array(
                                    'weight'  => $vol->weight,
                                    'width'   => $vol->dimensions->width,
                                    'height'  => $vol->dimensions->height,
                                    'lenght'  => $vol->dimensions->length,
                                    'cost_of_goods' => $vol->insurance_value,
                                    'products' => $vol->products,
                                );
                            }
                        }

                        $quote_data[$itemQuote->id] = array(
                            'code' => 'melhorenvio.' . $itemQuote->id,    //ftr_geral::getStrToIndex(trim($itemQuote->delivery_method_name)),
                            'title' => $text . $previsão,
                            'cost' => round((float)$preco, 2, PHP_ROUND_HALF_UP),
                            'days' => $prazo,
                            'text' => $this->currency->format($preco),
                            'volumes_info' => $volumesList,
                        );
                    }
                }

                if (empty($quote_data)) {
                    return false;
                }

                if ($return) {
                    $method_data = array(
                        'code' => 'melhorenvio',
                        'title' => 'Melhor Envio',
                        'quote' => $quote_data,
                        'sort_order' => $this->config->get('melhorenvio_sort_order'),
                        'error' => false
                    );
                }

            } catch (Exception $e) {
                $logData = [
                    'event'    => 'ShippingMelhorEnvio::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;
    }

}
