<?php

class Produto_ValidacoesrestricoesController extends Agro_Controller_Action
{
    public function configurarAction()
    {
        $this->view->title = "Produto » Validações » Restrições » Configurar";
        $this->view->criterios = (new Produto_Model_CriteriosRestricao())->fetchAll("fl_ativo is true")->toArray();
        $this->view->tiposSolo = (new Produto_Model_Tiposolo())->fetchAll("fl_ativo is true")->toArray();
        $this->view->id = $this->_requestParams['id'];
        $this->view->dadosCriteriosVinculados = (new Produto_Model_ValidacoesRestricoesCriterios())
            ->getCriteriosVinculados($this->_requestParams['id'])->toArray();

        if ($this->getRequest()->isPost()) {
            $this->salvarConfiguracoes();
        }
    }

    public function copiarAction()
    {
        $this->getHelper('layout')->disableLayout();

        $this->view->id = $this->_requestParams['id'];
        $this->_return['idNovo'] = null;

        if ($this->getRequest()->isPost()) {
            $this->isAjax();

            $adapter = Agro_Db_Table_Abstract::getDefaultAdapter();

            try {
                $adapter->beginTransaction();

                if (empty($this->_requestParams['idRestricao'])) {
                    throw new Exception('ID restrição não informado.');
                }

                if (empty($this->_requestParams['novoNome'])) {
                    throw new Exception('Nome da restrição não informado.');
                }

                $this->_return['idNovo'] = $this->getModel()->copiar(
                    (int)$this->_requestParams['idRestricao'],
                    $this->_requestParams['novoNome']
                );

                $adapter->commit();
            } catch (Exception $erro) {
                $this->_return['erro'] = true;
                $this->_return['mensagem'] = $erro->getMessage();

                $adapter->rollBack();
            }

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

    public function deleteAction()
    {
        $this->getModel()->deletarVinculos($this->_requestParams['id']);
        parent::deleteAction();
    }

    public function getatributosvinculadosAction()
    {
        $this->isAjax();

        $this->_return['culturas'] = (new Produto_Model_ValidacoesRestricoesCulturas())->fetchAll(
            ["id_validacoes_restricoes = {$this->_requestParams['id']}"]
        )->toArray();
        $this->_return['produtos'] = (new Produto_Model_ValidacoesRestricoesProdutos())->fetchAll(
            ["id_validacoes_restricoes = {$this->_requestParams['id']}"]
        )->toArray();
        $this->_return['coberturas'] = (new Produto_Model_ValidacoesRestricoesCoberturas())->fetchAll(
            ["id_validacoes_restricoes = {$this->_requestParams['id']}"]
        )->toArray();

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

    public function getFilter()
    {
        $where = [];

        if (!empty($this->_requestParams['id_pesquisa'])) {
            $where[] = [
                'field' => 'pvr.id',
                'operator' => '=',
                'value' => $this->_requestParams['id_pesquisa']
            ];

            return $where;
        }

        if (!empty($this->_requestParams['id_orcamento'])) {
            $where[] = [
                'field' => 'pvrcpe.id_proposta',
                'operator' => '=',
                'value' => $this->_requestParams['id_orcamento']
            ];
        }

        if (!empty($this->_requestParams['ds_nome'])) {
            $where[] = [
                'field' => 'pvr.ds_nome',
                'operator' => 'ilike',
                'value' => "%{$this->_requestParams['ds_nome']}%"
            ];
        }

        if (!empty($this->_requestParams['id_safra'])) {
            $where[] = [
                'field' => 'pvr.id_safra',
                'operator' => '=',
                'value' => $this->_requestParams['id_safra']
            ];
        }

        if (!empty($this->_requestParams['id_cultura_multiple'])) {
            $where[] = [
                'field' => 'pvrcu.id_cultura',
                'operator' => 'in',
                'value' => '(' . implode(', ', $this->_requestParams['id_cultura_multiple']) . ')'
            ];
        }

        if (!empty($this->_requestParams['id_produto_multiple'])) {
            $where[] = [
                'field' => 'pvrp.id_produto',
                'operator' => 'in',
                'value' => '(' . implode(', ', $this->_requestParams['id_produto_multiple']) . ')'
            ];
        }

        if (!empty($this->_requestParams['id_estado_multiple'])) {
            $where[] = [
                'field' => 'sm.id_estado',
                'operator' => 'in',
                'value' => '(' . implode(', ', $this->_requestParams['id_estado_multiple']) . ')'
            ];
        }

        if (!empty($this->_requestParams['id_municipio_multiple'])) {
            $where[] = [
                'field' => 'pvrm.id_municipio',
                'operator' => 'in',
                'value' => '(' . implode(', ', $this->_requestParams['id_municipio_multiple']) . ')'
            ];
        }

        if (!empty($this->_requestParams['id_cobertura_multiple'])) {
            $where[] = [
                'field' => 'pvrco.id_cobertura',
                'operator' => 'in',
                'value' => '(' . implode(', ', $this->_requestParams['id_cobertura_multiple']) . ')'
            ];
        }

        return $where;
    }

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

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

    public function getmunicipiosvinculadosAction()
    {
        $this->isAjax();

        try {
            if (empty($this->_requestParams['id'])) {
                throw new Exception('ID para busca não informado.');
            }

            $this->_return['municipios'] = (new Produto_Model_ValidacoesRestricoesMunicipios())->fetchAll(
                "id_validacoes_restricoes = {$this->_requestParams['id']}"
            )->toArray();
        } catch (Exception $erro) {
            $this->_return['erro'] = true;
            $this->_return['mensagem'] = $erro->getMessage();
        }

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

    public function init()
    {
        $this->view->title = "Produto » Validações » Restrições";
        $this->view->back = "/produto/validacoesrestricoes/index";
    }

    public function relacionarmunicipiosAction()
    {
        $this->view->title = "Produto » Validações » Restrições » Relacionar Municípios";
        $this->view->id = $this->_requestParams['id'];

        if ($this->getRequest()->isPost()) {
            $this->isAjax();

            $adapter = Agro_Db_Table_Abstract::getDefaultAdapter();

            try {
                $adapter->beginTransaction();

                $modelValidacoesRestricoesMunicipios = new Produto_Model_ValidacoesRestricoesMunicipios();
                $modelValidacoesRestricoesMunicipios->delete($this->_requestParams['id'], 'id_validacoes_restricoes');

                foreach ($this->_requestParams['municipios'] as $idMunicipio) {
                    $modelValidacoesRestricoesMunicipios->save([
                        'id_validacoes_restricoes' => $this->_requestParams['id'],
                        'id_municipio' => $idMunicipio,
                    ]);
                }

                $adapter->commit();
            } catch (Exception $erro) {
                $this->_return['erro'] = true;
                $this->_return['mensagem'] = $erro->getMessage();

                $adapter->rollBack();
            }

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

    public function salvarAction()
    {
        $this->isAjax();

        $adapter = Agro_Db_Table_Abstract::getDefaultAdapter();

        try {
            $adapter->beginTransaction();

            if (empty(trim($this->_requestParams['ds_nome']))) {
                throw new InvalidArgumentException('Campo Nome não informado.');
            }

            if (empty(trim($this->_requestParams['id_safra']))) {
                throw new InvalidArgumentException('Safra não informada.');
            }

            if (empty($this->_requestParams['culturas'])) {
                throw new InvalidArgumentException('É necessário ter ao menos uma Cultura.');
            }

            $modelValidacoesRestricoes = $this->getModel();
            $modelValidacoesRestricoesCulturas = new Produto_Model_ValidacoesRestricoesCulturas();
            $modelValidacoesRestricoesProdutos = new Produto_Model_ValidacoesRestricoesProdutos();
            $modelValidacoesRestricoesCoberturas = new Produto_Model_ValidacoesRestricoesCoberturas();

            $row = $modelValidacoesRestricoes->save($this->_requestParams);
            $modelValidacoesRestricoes->deletarVinculosCulturaProdutoCobertura($row['id']);

            foreach ($this->_requestParams['culturas'] as $idCultura) {
                $modelValidacoesRestricoesCulturas->save([
                    'id_validacoes_restricoes' => $row['id'],
                    'id_cultura' => $idCultura,
                ]);
            }

            foreach ($this->_requestParams['produtos'] as $idProduto) {
                $modelValidacoesRestricoesProdutos->save([
                    'id_validacoes_restricoes' => $row['id'],
                    'id_produto' => $idProduto,
                ]);
            }

            foreach ($this->_requestParams['coberturas'] as $idCobertura) {
                $modelValidacoesRestricoesCoberturas->save([
                    'id_validacoes_restricoes' => $row['id'],
                    'id_cobertura' => $idCobertura,
                ]);
            }

            $this->_return['id'] = $row['id'];

            $adapter->commit();
        } catch (Exception $erro) {
            $this->_return['erro'] = true;
            $this->_return['mensagem'] = $erro->getMessage();

            $adapter->rollBack();
        }

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

    private function salvarConfiguracoes()
    {
        $this->isAjax();
        $adapter = Agro_Db_Table_Abstract::getDefaultAdapter();

        try {
            $adapter->beginTransaction();

            switch ((int)$this->_requestParams['criterio']) {
                case Produto_Model_CriteriosRestricao::ID_DATA_SEMEADURA:
                    if (empty($this->_requestParams['dtInicial']) && empty($this->_requestParams['dtFinal'])) {
                        throw new Exception('É necessário informar ao menos uma das datas.');
                    }

                    if (
                        !empty($this->_requestParams['dtInicial']) && !empty($this->_requestParams['dtFinal'])
                        && Agro_Util::validaDataInicioFim(
                            $this->_requestParams['dtFinal'],
                            $this->_requestParams['dtInicial']
                        )
                    ) {
                        throw new Exception('Data Inicial não pode ser menor que Data Final.');
                    }

                    $row = $this->salvarCriterio(
                        (int)$this->_requestParams['id'],
                        (int)$this->_requestParams['criterio']
                    );

                    (new Produto_Model_ValidacoesRestricoesCriteriosSemeadura())->save([
                        'id_validacoes_restricoes_criterios' => $row['id'],
                        'dt_semeadura_inicio' => Agro_Util::formatDate(
                            $this->_requestParams['dtInicial'],
                            Zend_Date::W3C
                        ),
                        'dt_semeadura_fim' => Agro_Util::formatDate(
                            $this->_requestParams['dtFinal'],
                            Zend_Date::W3C
                        ),
                    ]);

                    break;

                case Produto_Model_CriteriosRestricao::ID_SISTEMA_PLANTIO:
                    if (empty($this->_requestParams['sistemasPlantio'])) {
                        throw new Exception('É necessário selecionar ao menos um Sistema de Plantio.');
                    }

                    $row = $this->salvarCriterio(
                        (int)$this->_requestParams['id'],
                        (int)$this->_requestParams['criterio']
                    );

                    $model = new Produto_Model_ValidacoesRestricoesCriteriosSistemaPlantio();

                    foreach ($this->_requestParams['sistemasPlantio'] as $idSistemaPlantio) {
                        $model->save([
                            'id_validacoes_restricoes_criterios' => $row['id'],
                            'id_sistema_plantio' => $idSistemaPlantio,
                        ]);
                    }

                    break;

                case Produto_Model_CriteriosRestricao::ID_TIPO_SOLO:
                    if (empty($this->_requestParams['tiposSolo'])) {
                        throw new Exception('É necessário selecionar ao menos um Tipo de Solo.');
                    }

                    $row = $this->salvarCriterio(
                        (int)$this->_requestParams['id'],
                        (int)$this->_requestParams['criterio']
                    );

                    $model = new Produto_Model_ValidacoesRestricoesCriteriosTipoSolo();

                    foreach ($this->_requestParams['tiposSolo'] as $idTipoSolo) {
                        $model->save([
                            'id_validacoes_restricoes_criterios' => $row['id'],
                            'id_tipo_solo' => $idTipoSolo,
                        ]);
                    }

                    break;

                default:
                    $this->salvarCriterio((int)$this->_requestParams['id'], (int)$this->_requestParams['criterio']);
                    break;
            }

            $adapter->commit();
        } catch (Exception $erro) {
            $this->_return['erro'] = true;
            $this->_return['mensagem'] = $erro->getMessage();

            $adapter->rollBack();
        }

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

    private function salvarCriterio(int $idValidacoesRestricoes, int $idCriteriosRestricao)
    {
        return (new Produto_Model_ValidacoesRestricoesCriterios())->save(
            [
                'id_validacoes_restricoes' => $idValidacoesRestricoes,
                'id_criterios_restricao' => $idCriteriosRestricao,
            ],
            true
        );
    }

    public function relacionarusuariosAction()
    {
        $this->isAjax();
		$model = new Produto_Model_RestricoesUsuarios();
        $id_validacao = $this->getRequest()->getParam('id_validacao');
        $ids_usuario = $this->getRequest()->getParam('ids_usuario');
		$model->clearUsuarios($id_validacao);

		try {
			if (is_array($ids_usuario)) {
				foreach ($ids_usuario as $idUser) {
					$model->save($id_validacao, $idUser);
				}
			}
			
			$result = array("status"=>true, "message"=>"Usuários relacionados com sucesso.");
			
		} catch (Exception $e) {
			$result = array("status"=>false, "message"=>"Não foi possível relacionar usuários.\n\nErro:$e->getMessage()");
			
		}
		
		$this->getResponse()->setBody(Zend_Json::encode($result));
    }

    public function relacionausuarioAction() {
		$this->getHelper('layout')->disableLayout();

		$Model = new Produto_Model_RestricoesUsuarios();
		
        $this->view->relacionados = $Model->getUsuariosRelacionados($this->getRequest()->getParam('id'));
		$this->view->id = $this->getRequest()->getParam('id');
	}
}
