<?php

class DadosST
{
    public $EmpresaID  = 0;
    public $CadastroID = 0;
    public $Produtos = array();

    public function addProdutos($produtoClass)
    {
        array_push($this->Produtos, $produtoClass);
    }

    public function getProducts()
    {
        return $this->Produtos;
    }
}

class Produto
{
    public $ProdutoId      = 0;
    public $Quantidade     = 0;
    public $ValorUnitario  = 0;
    public $AcrescimoPerc  = 0;
    public $AcrescimoValor = 0;
    public $DescontoPerc   = 0;
    public $SeguroValor    = 0;
    public $FreteValor     = 0;
    public $DescontoValor  = 0;
    public $Sequencia      = 0;
    public $sequenceKitKey = 0;
}

class Futuracalcularst
{

    private $registry;
    private $config;
    private $db;
    private $request;
    private $session;
    private $cart;
    private $wsceo;

    public function __construct($registry)
    {
    }

    public function loadInstances($registry)
    {
        $this->config   = $registry->get('config');
        $this->db       = $registry->get('db');
        $this->request  = $registry->get('request');
        $this->session  = $registry->get('session');
        $this->cart     = $registry->get('cart');
        $this->wsceo    = $registry->get('wsceo');
        $this->registry = $registry;

        if (!isset($this->session->data['histcalculost'])) {
            $this->session->data['histcalculost'] = new DadosST();
        }

        if (!isset($this->session->data['ultimocalculost'])) {
            $this->session->data['ultimocalculost'] = false;
        }

        if (!isset($this->session->data['ultimaconsultarest'])) {
            $this->session->data['ultimaconsultarest'] = 0;
        }

        if (!isset($this->session->data['IDSession'])) {
            $this->session->data['IDSession'] = null;
        }
    }

    public function __get($name)
    {
        return $this->registry->get($name);
    }

    public function getSubTotal($produtos)
    {
        $total = 0;

        foreach ($produtos as $product) {
            $total += $product['total'];
        }
        return $total;
    }

    public function getDescontoAcrescimo($tipo = Type_DescontoAcrescimo::Tp_Desconto, $discountkit = false)
    {
        // Totals
        $this->load->model('setting/extension');

        $total_data = array();
        $total = 0;
        $retorno = 0;


        // Display prices
        if (($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) {
            $results = $this->model_setting_extension->getExtensions('total', Type_ExtensionSubType::Tp_TotalizadorAcrescimoDesconto);

            foreach ($results as $result) {
                if ($this->config->get($result['code'] . '_status') && (($result['code'] != 'descontoacrescimokit') || $discountkit)) {
                    $this->load->model('total/' . $result['code']);

                    $this->{'model_total_' . $result['code']}->getTotal($total_data, $total);
                }
            }

            foreach ($total_data as $data) {

                if (($tipo == Type_DescontoAcrescimo::Tp_Desconto) && ($data['value'] < 0)) {
                    $retorno += $data['value'];
                } elseif (($tipo == Type_DescontoAcrescimo::Tp_Acrescimo) && ($data['value'] > 0)) {
                    $retorno += $data['value'];
                }
            }
        }

        return ($tipo == Type_DescontoAcrescimo::Tp_Desconto) ?  $retorno * -1 : $retorno;
    }


    private function recalculaImpostos(DadosST $ultimoCalculo, DadosST $atual)
    {
        $prodold   = $ultimoCalculo->Produtos;
        $prodatual = $atual->Produtos;

        if (sizeof($prodold) != sizeof($prodatual)) {
            return true;
        }

        if (($ultimoCalculo->EmpresaID != $atual->EmpresaID) || ($ultimoCalculo->CadastroID != $atual->CadastroID)) {
            return true;
        }

        $produtosOld  = $ultimoCalculo->Produtos;
        $produtoAtual = $atual->Produtos;

        $x = 0;
        foreach ($produtosOld as $produtoOld) {
            if (
                ($produtoOld->ProdutoId    != $produtoAtual[$x]->ProdutoId)      ||
                ($produtoOld->Quantidade     != $produtoAtual[$x]->Quantidade)     ||
                ($produtoOld->ValorUnitario  != $produtoAtual[$x]->ValorUnitario)  ||
                ($produtoOld->AcrescimoPerc  != $produtoAtual[$x]->AcrescimoPerc)  ||
                ($produtoOld->AcrescimoValor != $produtoAtual[$x]->AcrescimoValor) ||
                ($produtoOld->DescontoPerc   != $produtoAtual[$x]->DescontoPerc)   ||
                ($produtoOld->DescontoValor  != $produtoAtual[$x]->DescontoValor)  ||
                ($produtoOld->SeguroValor    != $produtoAtual[$x]->SeguroValor)    ||
                ($produtoOld->FreteValor     != $produtoAtual[$x]->FreteValor)
            ) {
                return true;
            };

            $x++;
        }

        return false;
    }

    private function getJsonInput($produtos, $clienteid, $totaldesconto=0, $totalacrescimo = 0)
    {

        $query = $this->db->query("select value from " . DB_PREFIX . "setting s where (s.key = 'futuracalcularst_usuario') and (s.group = 'futuracalcularst')");

        if (!($query->num_rows)) {
            $this->session->data['ultimocalculost'] = false;
            return false;
        }
        $empresaid = $query->row['value'];

        $dadosst             = new DadosST();
        $dadosst->CadastroID = $clienteid;
        $dadosst->EmpresaID  = $empresaid;

        if (isset($this->session->data['shipping_method']['cost'])) {
            $totalfrete = $this->session->data['shipping_method']['cost'];
        } else {
            $this->session->data['ultimocalculost'] = false;
            return false;
        }

        foreach ($produtos as $produto) {
            $classProduto = new Produto();

            $classProduto->ProdutoId       = $produto['id_futura'];
            $classProduto->Quantidade      = $produto['quantity'];
            $classProduto->ValorUnitario   = $produto['price'];

            $classProduto->AcrescimoPerc   = $produto['acrescimo_percentual'];
            $classProduto->AcrescimoValor  = $produto['acrescimo_valor'];
            $classProduto->DescontoPerc    = $produto['desconto_percentual'];
            $classProduto->DescontoValor   = $produto['desconto_valor'];

            $classProduto->SeguroValor     = 0;
            $classProduto->FreteValor      = $produto['frete_valor'];

            $classProduto->Sequencia = isset($produto['sequencia']) ? $produto['sequencia'] : 0;
            $classProduto->sequenceKitKey = isset($produto['sequence_kit_key']) ? $produto['sequence_kit_key'] : 0;

            $dadosst->addProdutos($classProduto);
        }

        $recalcular = $this->recalculaImpostos($this->session->data['histcalculost'], $dadosst);

        $this->session->data['histcalculost'] = $dadosst;

        //se n�o teve mudan�a, nao recalcula os valores....
        if (($recalcular) || (!$this->session->data['ultimocalculost'])) {
            $this->session->data['ultimocalculost'] = false;
            return $dadosst;
        } else {
            return false;
        }
    }

    public function getconfiguracoes()
    {
        $result = array();

        $query = $this->db->query("select s.value, s.key from " . DB_PREFIX . "setting s where (s.group = 'futuracalcularst') and ((s.key = 'futuracalcularst_status') or (s.key = 'futuracalcularst_user') or (s.key = 'futuracalcularst_senha') or (s.key = 'futuracalcularst_ip') or (s.key = 'futuracalcularst_porta') or (s.key = 'futuracalcularst_id_empresa')) ");

        if (count($query->rows)>0){
            foreach ($query->rows as $data) {
                $result[$data['key']] = $data['value'];
            }
        }else{
            $result['futuracalcularst_status'] = false;
        }
        return $result;
    }

    public function getJsonCalculaST($produtos, $cliente)
    {
        if (!$produtos) {
            return false;
        }

        $vatual = time();

        //Captura JSON no model
        $jsoninput = $this->getJsonInput($produtos, $cliente);


        if ((($vatual - $this->session->data['ultimaconsultarest']) <= 20) && (!$this->session->data['ultimocalculost']) && ($this->session->data['ultimaconsultarest'] != 0)) {
            return false;
        }

        if ($this->session->data['ultimocalculost'] && (!$jsoninput)) {
            return $this->session->data['ultimocalculost'];
        }

        if ((!$this->session->data['ultimocalculost'])  && (!$jsoninput)) {
            return false;
        }

        //Consumindo WEBSERVICE em partes de 100 itens cada... ByMatheus
        $prodsAux = $jsoninput->Produtos;

        $json             = array();
        $listjsonCount  = 0;
        $countAdd         = -1;

        while (sizeof($prodsAux) > 0) {
            $tmpDadosst             = new DadosST();
            $tmpDadosst->CadastroID = $jsoninput->CadastroID;
            $tmpDadosst->EmpresaID  = $jsoninput->EmpresaID;

            $produtosTemp = array();
            for ($count = 0; $count <= 100; $count++) {
                if (sizeof($prodsAux) > 0) {
                    $countAdd++;
                    array_push($produtosTemp, $prodsAux[$countAdd]);
                    unset($prodsAux[$countAdd]);
                } else {
                    break;
                }
            }

            $tmpDadosst->Produtos = $produtosTemp;

            $jsonTemp           = array();
            $jsonTemp['json'] = $tmpDadosst;

            $jsonretorno      = $this->wsceo->getCalcularST(json_encode($jsonTemp));

            if (!$jsonretorno) {
                return false;
            }

            /*Ajuste do KIT
			Pegando os itens que fazem parte do KIT e agrupando de volta no KIT
			é usada a sequencia pois era o campo disponivel no ceo para referenciar o iten enviado do retornado
			então eu envio a sequencia e no retorno comparo a sequencia do item que foi enviado com a do que retornou para agrupalo no kit.*/
            $jsonretornoAux = array();
            foreach ($produtos as $produto) {
                if (isset($produto['product_kit_id'])) {
                    foreach ($jsonretorno as $key => $itemKit) {
                        if ($produto['sequencia'] == $itemKit['Sequencia']) {
                            $idx = $produto['product_kit_id'];
                            $jsonretornoAux[$idx]['ProdutoId']      = $produto['id_pkit_futura'];
                            //Campos acumulados para gerar os totais do produto pai (KIT)
                            $jsonretornoAux[$idx]['ValorUnitario']  = $itemKit['ValorUnitario']  + (isset($jsonretornoAux[$idx]['ValorUnitario']) ? $jsonretornoAux[$idx]['ValorUnitario'] : 0);
                            $jsonretornoAux[$idx]['acrescimo_valor'] = $itemKit['AcrescimoValor'] + (isset($jsonretornoAux[$idx]['acrescimo_valor']) ? $jsonretornoAux[$idx]['acrescimo_valor'] : 0);
                            $jsonretornoAux[$idx]['desconto_valor']  = $itemKit['DescontoValor']  + (isset($jsonretornoAux[$idx]['desconto_valor']) ? $jsonretornoAux[$idx]['desconto_valor'] : 0);
                            $jsonretornoAux[$idx]['frete_valor']     = $itemKit['FreteValor']     + (isset($jsonretornoAux[$idx]['frete_valor']) ? $jsonretornoAux[$idx]['frete_valor'] : 0);
                            $jsonretornoAux[$idx]['SeguroValor']    = $itemKit['SeguroValor']    + (isset($jsonretornoAux[$idx]['SeguroValor']) ? $jsonretornoAux[$idx]['SeguroValor'] : 0);
                            $jsonretornoAux[$idx]['IPIValor']       = $itemKit['IPIValor']       + (isset($jsonretornoAux[$idx]['IPIValor']) ? $jsonretornoAux[$idx]['IPIValor'] : 0);
                            $jsonretornoAux[$idx]['SubstTribValor'] = $itemKit['SubstTribValor'] + (isset($jsonretornoAux[$idx]['SubstTribValor']) ? $jsonretornoAux[$idx]['SubstTribValor'] : 0);
                            $jsonretornoAux[$idx]['ICMSValor']      = $itemKit['ICMSValor']      + (isset($jsonretornoAux[$idx]['ICMSValor']) ? $jsonretornoAux[$idx]['ICMSValor'] : 0);
                            $jsonretornoAux[$idx]['FcpValor']       = $itemKit['FcpValor']       + (isset($jsonretornoAux[$idx]['FcpValor']) ? $jsonretornoAux[$idx]['FcpValor'] : 0);
                            $jsonretornoAux[$idx]['FcpSubstTribValor'] = $itemKit['FcpSubstTribValor'] + (isset($jsonretornoAux[$idx]['FcpSubstTribValor']) ? $jsonretornoAux[$idx]['FcpSubstTribValor'] : 0);
                            $jsonretornoAux[$idx]['ICMSBase']       = $itemKit['ICMSBase']       + (isset($jsonretornoAux[$idx]['ICMSBase']) ? $jsonretornoAux[$idx]['ICMSBase'] : 0);
                            $jsonretornoAux[$idx]['FcpBase']        = $itemKit['FcpBase']        + (isset($jsonretornoAux[$idx]['FcpBase']) ? $jsonretornoAux[$idx]['FcpBase'] : 0);
                            $jsonretornoAux[$idx]['SubstTribBase']  = $itemKit['SubstTribBase']  +  (isset($jsonretornoAux[$idx]['SubstTribBase']) ? $jsonretornoAux[$idx]['SubstTribBase'] : 0);
                            $jsonretornoAux[$idx]['FcpSubstTribBase']  = $itemKit['FcpSubstTribBase']  + (isset($jsonretornoAux[$idx]['FcpSubstTribBase']) ? $jsonretornoAux[$idx]['FcpSubstTribBase'] : 0);
                            $jsonretornoAux[$idx]['AcrescimoPerc']  = $itemKit['AcrescimoPerc'];
                            $jsonretornoAux[$idx]['DescontoPerc']   = $itemKit['DescontoPerc'];
                            $jsonretornoAux[$idx]['IPIAliquota']    = $itemKit['IPIAliquota'];
                            $jsonretornoAux[$idx]['IVAAliquota']    = $itemKit['IVAAliquota'];
                            $jsonretornoAux[$idx]['ICMSAliquota']   = $itemKit['ICMSAliquota'];
                            $jsonretornoAux[$idx]['ICMSReducao']    = $itemKit['ICMSReducao'];
                            $jsonretornoAux[$idx]['FcpAliquota']    = $itemKit['FcpAliquota'];
                            $jsonretornoAux[$idx]['FcpSubstTribAliquota'] = $itemKit['FcpSubstTribAliquota'];
                            $jsonretornoAux[$idx]['product_id_futura'] = $itemKit['ProdutoId'];

                            $jsonretornoAux[$idx]['itens_kit'][$itemKit['ProdutoId']] = $itemKit;

                            unset($jsonretorno[$key]);
                            break;
                        }
                    }
                }
            }
            $jsonretorno = array_merge($jsonretorno, $jsonretornoAux);
            foreach ($jsonretorno as $produto) {
                $retorno[$produto['ProdutoId']] = $produto;
            }
            /* Ajuste do KIT */
            $listjsonCount++;
            $json += $retorno;
        }
        $this->session->data['ultimocalculost'] = $json;
        return $json;
    }

    public function jsonencode($json)
    {
        return json_encode($json);
    }
}
