<?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');
        if (!isset($modules) || count($modules) === 0) {
            return;
        }

        $specificRegions = [];
        $allRegions = [];

        foreach ($modules as $module) {
            if (empty($module['geo_zone_id']) || $module['geo_zone_id'] == '0') {
                $allRegions[] = $module;

            } else {
                $address = isset($this->session->data['shipping_address_id']) ? $this->model_account_address->getAddress($this->session->data['shipping_address_id']) : false;
                
                if (!$address) {
                    continue; // Se não houver endereço, pula para o próximo módulo
                }

                // verifica se geo_zone_id do módulo e compativel com  o endereço selecionado...
                $query = $this->db->query("
                    SELECT 1
                    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 && $valorbase >= $module['valor_perfil']) {
                    $specificRegions[] = $module;
                }
            }
        }

        $applicableRegionModules = !empty($specificRegions) ? $specificRegions : $allRegions;

        usort($applicableRegionModules, function ($a, $b) {
            return (int) $a['valor_perfil'] - (int) $b['valor_perfil'];
        });

        $faixa = null;
        $valor = 0;
        $tipovalor = null;
        $texto = '';

        foreach ($applicableRegionModules as $module) {

            if (isset($module['periodo_dias_desconto']) && (int) $module['periodo_dias_desconto'] > 0) {
                if ($this->customer->getId() === null) {
                    continue;
                }

                $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"));
                    $diff = $dataOrder->diff($dataAtual);

                    if ($diff->days > (int) $module['periodo_dias_desconto']) {
                        continue;
                    }
                }
            }

            $perfil = (int) $module['valor_perfil'];
            $desconto = (float) $module['valor_desconto'];

            if ($tipooperacao == ModelTotaldescontofaixavalorpedido::TIPO_DESCONTO) {
                if ($valorbase >= $perfil && ($faixa === null || $perfil > $faixa)) {
                    $faixa = $perfil;
                    $valor = $desconto;
                    $tipovalor = $module['tipo_valor'];
                    $texto = $module['texto'] ?: 'Desconto';
                }
            } else {
                if ($valorbase <= $perfil && ($faixa === null || $perfil < $faixa)) {
                    $faixa = $perfil;
                    $valor = $desconto;
                    $tipovalor = $module['tipo_valor'];
                    $texto = $module['texto'] ?: 'Acréscimo';
                }
            }
        }

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

        if (($valor) && ($valor > 0) && ($valor != '')) {

            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;
        }
    }

}
