<?php

class ModelTotaldescontofaixavalorpedido extends Model
{

    const TIPO_ATIVO = 1;
    const TIPO_INATIVO = 0;

    const TIPO_ACRESCIMO = 0;
    const TIPO_DESCONTO = 1;

    const TIPOCALC_VALOR = 0;
    const TIPOCALC_PERCENTUAL = 1;

    public function getTotal(&$total_data, &$total)
    {
        $this->load->model('account/address');
        $tipooperacao = $this->config->get('descontofaixavalorpedido_tipo'); // desconto(1) ou acrescimo(0)
        $tipototal = $this->config->get('descontofaixavalorpedido_valor_base'); // total dos produtos(1) ou total do pedido(0)

        $valorbase = ($tipototal == ModelTotaldescontofaixavalorpedido::TIPO_ATIVO) ? $this->cart->getSubTotal() : $total;

        $modules = $this->config->get('descontofaixavalorpedido_module');
        $valor = 0;
        $faixa = 0;
        $texto = "";
        $allRegions = null;
        $status = false;

        if (isset($modules) && count($modules) > 0) {
            
            if ($this->customer->isLogged() && isset($this->session->data['shipping_address_id'])) {
                $address = $this->model_account_address->getAddress($this->session->data['shipping_address_id']);
            } else if (isset($this->session->data['guest'])) {
                $address = $this->session->data['guest']['shipping'];
            } else {
                return;
            }
            
            foreach ($modules as $module) {
                if (!$module['geo_zone_id']) {
                    $allRegions = $module;
                    continue;
                }

                // Verifica se o geo_zone_id do módulo é aplicável ao endereço
                $query = $this->db->query("
                SELECT * FROM " . DB_PREFIX . "zone_to_geo_zone 
                WHERE geo_zone_id = '" . (int) $module['geo_zone_id'] . "' 
                AND country_id = '" . (int) $address['country_id'] . "' 
                AND (zone_id = '" . (int) $address['zone_id'] . "' OR zone_id = '0')
                ");

                if ($query->num_rows > 0) {
                    $status = true;
                    break;
                }
            }

            // Aplicar desconto/acréscimo "todas regiões" se houver configuração e se não houver módulo regional compatível
            if (!$status && $allRegions) {
                $module = $allRegions;
                $status = true;
            }

            if ($status) {
                if (isset($module['periodo_dias_desconto']) && $module['periodo_dias_desconto'] > 0) {
                    if ($this->customer->getId() == null) {
                        return;
                    }
                    $this->load->dmodel('account/customer');
                    $order_info = $this->dmodel_account_customer->getLastOrders($this->customer->getId(), $this->config->get('descontofaixavalorpedido_status_validade'), 1);
                    if (is_array($order_info) && count($order_info) > 0) {
                        $dataorder = new DateTime($order_info[0]['date_added']);
                        $dataAtual = new DateTime(date("Y-m-d"));
                        $diferenca = $dataorder->diff($dataAtual);
                        if ($diferenca->days > $module['periodo_dias_desconto']) {
                            return;
                        }
                    }
                }

                if (
                    (($tipooperacao == ModelTotaldescontofaixavalorpedido::TIPO_DESCONTO) && ($valorbase >= (int) $module['valor_perfil']) && ((int) $module['valor_perfil'] > $faixa)) ||
                    (($tipooperacao == ModelTotaldescontofaixavalorpedido::TIPO_ACRESCIMO) && ($valorbase <= (int) $module['valor_perfil']) && (((int) $module['valor_perfil'] < $faixa) || $faixa == 0))
                ) {
                    $valor = $module['valor_desconto'];
                    $faixa = $module['valor_perfil'];
                    $tipovalor = $module['tipo_valor'];

                    $texto = $module['texto'] ?: (($tipooperacao == ModelTotaldescontofaixavalorpedido::TIPO_ACRESCIMO) ? "Acrescimo" : "Desconto");
                }
            }
        }

        if ((isset($tipovalor) && $tipovalor == self::TIPOCALC_VALOR) && ($valor > $valorbase)) {
            return;
        }

        if ($valor > 0) {
            if ($tipovalor == self::TIPOCALC_PERCENTUAL) {
                $percent = $valor;
                $valor = ($valor / 100) * $valorbase;
            }

            if ($tipooperacao == ModelTotaldescontofaixavalorpedido::TIPO_DESCONTO) {
                $valor = -$valor;
            }

            $total_data[] = array(
                'code' => 'descontofaixavalorpedido',
                'title' => ($tipovalor) ? $texto . ' ( ' . $percent . '%)' : $texto,
                'text' => $this->currency->format($valor),
                'value' => $valor,
                'sort_order' => $this->config->get('descontofaixavalorpedido_sort_order')
            );

            $total += $valor;
        }
    }

}
