<?php

class Produto_GestaocomissaoController extends Agro_Controller_Action
{
    public function formAction()
    {
        $safraAtual = (new Produto_Model_Safras)->getSafraAtual();
        $this->view->culturas = (new Produto_Model_Culturas())->getCombo(false);
        $this->view->corretores = (new Sistema_Model_Corretores())->getComboUsuario(true, true);
        $this->view->ufs = (new Sistema_Model_Estados())->getCombo('ds_sigla', false, false);
        $this->view->ds_nome_safra = $safraAtual['ds_nome_safra'];

        return parent::formAction();
    }

    public function getvinculosAction()
    {
        $this->isAjax();
        $retorno = [
            'erro' => false,
            'mensagem' => '',
            'culturas' => [],
            'usuarios' => [],
            'produtos_salvar' => [],
            'produtos_list' => [],
            'ufs' => [],
        ];
        $parametros = $this->getRequest()->getParams();

        if (empty($parametros['idGestaoComissao'])) {
            $this->getResponse()->setBody(Zend_Json::encode($retorno));
            return;
        }

        $retorno['culturas'] = (new Produto_Model_GestaoComissaoCulturas())->getIdCulturas($parametros['idGestaoComissao']);
        $retorno['produtos_salvar']= (new Produto_Model_GestaoComissaoProdutos())->getIdProdutos($parametros['idGestaoComissao']);
        $retorno['ufs']= (new Produto_Model_GestaoComissaoEstados())->getIdEstados($parametros['idGestaoComissao']);
        $retorno['usuarios']= (new Produto_Model_GestaoComissaoUsuarios())->getIdUsuarios($parametros['idGestaoComissao']);

        if (!empty($retorno['culturas'])) {
            $safraAtual = (new Produto_Model_Safras)->getSafraAtual();
            $produtos = (new Produto_Model_Produtos())->getComboBySafraCultura($safraAtual['id'], $retorno['culturas']);

            foreach ($produtos as $indice => $produto) {
                $retorno['produtos_list'][] = ['value' => $indice, 'text' => $produto];
            }
        }

        $this->getResponse()->setBody(Zend_Json::encode($retorno));
    }

    public function getFilter()
    {
        $parametros = $this->getRequest()->getParams();
        $where = [];

        if (!empty($parametros['id_cultura'])) {
            $where[] = [
              'field'    => 'gcc.id_cultura',
              'operator' => '=',
              'value'    => $parametros['id_cultura']
            ];
        }

        if (!empty($parametros['id_corretor_usuario']) && empty($parametros['id_preposto_usuario'])) {
            $corretores = implode(', ', $parametros['id_corretor_usuario']);
            $value = "({$corretores})";
            $value .= " OR gcu.id_usuario in (SELECT p.id_usuario FROM sistema.prepostos p WHERE p.id_corretor IN (SELECT c.id FROM sistema.corretores c WHERE c.id_usuario IN ({$corretores})))";
            $value .= " OR gcu.id is null";

            $where[] = [
              'field'    => 'gcu.id_usuario',
              'operator' => 'in',
              'value'    => $value
            ];
        }

        if (!empty($parametros['id_preposto_usuario'])) {
            $where[] = [
              'field'    => 'gcu.id_usuario',
              'operator' => 'in',
              'value'    => '(' . implode(', ', $parametros['id_preposto_usuario']) . ') OR gcu.id is null'
            ];
        }

        if (!empty($parametros['fl_ativo'])) {
            $where[] = [
              'field'    => 'gc.fl_ativo',
              'operator' => '=',
              'value'    => $parametros['fl_ativo'] === 'true' ? 't' : 'f'
            ];
        }

        if (!empty($parametros['id_produto'])) {
            $where[] = [
              'field'    => 'gcp.id_produto',
              'operator' => 'in',
              'value'    => '(' . implode(', ', $parametros['id_produto']) . ')'
            ];
        }

        if (!empty($parametros['id_estado'])) {
            $where[] = [
              'field'    => 'gce.id_estado',
              'operator' => 'in',
              'value'    => '(' . implode(', ', $parametros['id_estado']) . ')'
            ];
        }

        return $where;
    }

    public function getForm()
    {
        return new Produto_Form_GestaoComissao();
    }

    public function getModel()
    {
        return new Produto_Model_GestaoComissao();
    }

    public function init()
    {
        $this->view->title = "Produto » Configurações » Comissão » Gestão de Comissão";
        $this->view->back = '/produto/gestaocomissao/index/menu/1';
    }

    public function salvarAction()
    {
        $this->isAjax();
        $retorno = ['erro' => false, 'mensagem' => 'Dados salvos com sucesso.', 'id' => ''];
        $parametros = $this->getRequest()->getParams();
        $adapter = Agro_Db_Table_Abstract::getDefaultAdapter();

        try {
            $adapter->beginTransaction();

            if (empty($parametros['produtosRelacionados'])) {
                throw new Exception("Ao menos um produto deve ser selecionado.", 1);
            }

            if (empty($parametros['ufsRelacionados'])) {
                throw new Exception("Ao menos uma UF deve ser selecionada.", 1);
            }

            $modelGestaoComissao = $this->getModel(); 
            $rowGestaoComissao = $modelGestaoComissao->save([
              'id'           => $parametros['id'],
              'ds_descricao' => $parametros['ds_descricao'],
              'vl_comissao'  => $parametros['vl_comissao'],
              'id_safra'     => (new Produto_Model_Safras())->getSafraAtual('id')
            ]);

            if (!$rowGestaoComissao) {
                throw new Exception("Erro ao salvar a gestão de comissão.", 1);
            }

            $retorno['id'] = $rowGestaoComissao['id'];
            $modelGestaoComissao->deleteVinculos($rowGestaoComissao['id']);

            foreach ($parametros['culturasRelacionadas'] as $idCultura) {
                $rowCultura = (new Produto_Model_GestaoComissaoCulturas())->save([
                    'id_gestao_comissao' => $rowGestaoComissao['id'],
                    'id_cultura' => $idCultura
                ]);

                if (!$rowCultura) {
                    throw new Exception("Erro ao vincular a cultura com a gestão de comissão.", 1);
                }
            }

            foreach ($parametros['usuariosSelecionados'] as $idUsuario) {
                $rowUsuario = (new Produto_Model_GestaoComissaoUsuarios())->save([
                    'id_gestao_comissao' => $rowGestaoComissao['id'],
                    'id_usuario' => $idUsuario
                ]);

                if (!$rowUsuario) {
                    throw new Exception("Erro ao vincular o usuário com a gestão de comissão.", 1);
                }
            }

            foreach ($parametros['ufsRelacionados'] as $idEstado) {
                $rowEstado = (new Produto_Model_GestaoComissaoEstados())->save([
                    'id_gestao_comissao' => $rowGestaoComissao['id'],
                    'id_estado' => $idEstado
                ]);

                if (!$rowEstado) {
                    throw new Exception("Erro ao vincular o estado com a gestão de comissão.", 1);
                }
            }

            foreach ($parametros['produtosRelacionados'] as $idProduto) {
                $rowProduto = (new Produto_Model_GestaoComissaoProdutos())->save([
                    'id_gestao_comissao' => $rowGestaoComissao['id'],
                    'id_produto' => $idProduto
                ]);

                if (!$rowProduto) {
                    throw new Exception("Erro ao vincular o produto com a gestão de comissão.", 1);
                }
            }

            $adapter->commit();
        } catch (Exception $erro) {
            $adapter->rollback();

            $retorno['erro'] = true;
            $retorno['mensagem'] = 'Erro ao salvar os dados.';

            if ($erro->getCode() === 1) {
                $retorno['mensagem'] = $erro->getMessage();
            }
        }

        $this->getResponse()->setBody(Zend_Json::encode($retorno));
    }

    public function getprodutosbyculturasAction(): void
    {
        $this->isAjax();
        $retorno = [
            'erro' => false,
            'mensagem' => '',
            'produtos' => [],
        ];

        try {
            $params = $this->getRequest()->getParams();

            if (!is_array($params['culturas'])) {
                throw new Exception("Formato das culturas informadas inválido.");
            }

            $safraAtual = (new Produto_Model_Safras)->getSafraAtual();
            $produtos = (new Produto_Model_Produtos())->getComboBySafraCultura($safraAtual['id'], $params['culturas']);

            foreach ($produtos as $indice => $produto) {
                $retorno['produtos'][] = ['value' => $indice, 'text' => $produto];
            }

        } catch (\Throwable $th) {
            $retorno['erro'] = false;
            $retorno['mensagem'] = $th->getMessage();
        }

        $this->getResponse()->setBody(Zend_Json::encode($retorno));
    }

    public function validarconfiguracoesconflitantesAction(): void
    {
        $this->isAjax();
        $retorno = ['erro' => false, 'mensagem' => ''];

        try {
            $params = $this->getRequest()->getParams();

            if (!is_array($params['produtos'])) {
                throw new Exception("Formato dos Produtos informados inválido.");
            }

            if (!is_array($params['ufs'])) {
                throw new Exception("Formato das UFs informadas inválido.");
            }

            if (!empty($params['usuarios']) && !is_array($params['usuarios'])) {
                throw new Exception("Formato dos Corretores/Sublogins informados inválido.");
            }

            $idGestaoComissao = !empty($params['id_gestao_comissao']) ? (int) $params['id_gestao_comissao'] : null;
            
            $configuracoes = (new Produto_Model_GestaoComissao())->getConfiguracoesConflitantes(
                $params['produtos'],
                $params['ufs'],
                $params['usuarios'],
                $idGestaoComissao
            );

            $retorno['mensagem'] = '';
        } catch (\Throwable $th) {
            $retorno['erro'] = true;
            $retorno['mensagem'] = $th->getMessage();
        }

        $this->getResponse()->setBody(Zend_Json::encode($retorno));
    }
}
