<?php

class Produto_AtributogrupoController extends Agro_Controller_Action {
	public $_paginator = false;

	public function init() {
		$this->view->title = 'Produto » Atributos » Grupo';
	}

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

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

		$where[] = array(
			'field' => 'ds_tipo',
			'operator' => '=',
			'value' => $this->getRequest()->getParam('tipo')
		);

		$where[] = array(
			'field' => 'id_produto',
			'operator' => '=',
			'value' => $this->getRequest()->getParam('produto')
		);

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

        if (!empty($parametros['cpf_cnpj'])) {
		    if (!empty($parametros['base64_decode'])) {
                $parametros['cpf_cnpj'] = base64_decode($parametros['cpf_cnpj']);
            }

            $where[] = [
              'field' => 'prop.cpf_cnpj',
              'operator' => '=',
              'value' => $parametros['cpf_cnpj']
            ];
        }

		return $where;
	}

	public function listAction() {
		$this->view->tipo = $this->getRequest()->getParam('tipo');
		$this->view->id_produto = $this->getRequest()->getParam('produto');

		parent::listAction();
	}

	public function saveAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();
		$result = array('execute' => "$.listGrupos($('.formGrupo #ds_tipo').val());");
		$Model = $this->getModel();

		$result['status'] = $Model->save($this->getRequest()->getParams());

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

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

		$this->view->grupo = $this->getRequest()->getParam('grupo');

		switch ($this->getRequest()->getParam('tipo')) {
			case 'q':
				$this->view->tipo = 'QUESTIONARIO';
				break;
			case 'p':
				$this->view->tipo = 'PROPRIEDADE';
				break;
			case 'u':
				$this->view->tipo = 'UNIDADE_SEGURADA';
				break;
		}
	}

	public function saveatributosAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();
		$valores = $this->getRequest()->getParam('value_atributo');
		$tipo = $this->getRequest()->getParam('tipo');
        $retorno = ['erro' => false, 'mensagem' => 'Atributos relacionados com sucesso.'];

		if (is_array($this->getRequest()->getParam('atributos'))) {
			$Model = new Produto_Model_ProdutosAtributos();

			try {
				$Model->getDefaultAdapter()->beginTransaction();
				$Model->deleteProdutoAtributo($this->getRequest()->getParam('grupo'));

				$limiteMinimoCultivo = null;
				$limiteMaximoCultivo = null;

				foreach ($this->getRequest()->getParam('atributos') as $atributo) {
                    $rowAtributo = (new Produto_Model_Atributos())->find($atributo)->current();

					if ($rowAtributo['ds_chave_rn'] === Produto_Model_Atributos::DS_CHAVE_LIMITE_MAXIMO_CULTIVO) {
						$limiteMaximoCultivo = $valores[$atributo];
					}

					if ($rowAtributo['ds_chave_rn'] === Produto_Model_Atributos::DS_CHAVE_LIMITE_MINIMO_CULTIVO) {
						$limiteMinimoCultivo = $valores[$atributo];
					}

                    if ($rowAtributo['ds_chave_rn'] === Produto_Model_Atributos::DS_CHAVE_PROD_SUBVENCAO_FEDERAL_VALOR_MAX_GRUPO) {
                        if (!isset($valores[$atributo.'_complemento']) || empty($valores[$atributo])) {
                            throw new \Exception(
                              'Valor e/ou grupo não informado na propriedade Valor máximo da Subvenção Federal - Por Grupo.',
                              Produto_Model_Atributos::EXCEPTION_PROD_SUBVENCAO_FEDERAL_VALOR_MAX_GRUPO_NAO_INFORMADO
                            );
                        }
                    }

                    if ($rowAtributo['ds_chave_rn'] === 'PROD_TIPO_FINAL_VIGENCIA') {
                        if (empty($valores[$atributo.'_complemento']) && ($valores[$atributo] == 3)) {
                            throw new \Exception(
                              'Número de dias para opção "Por Data Plantio" selecionada, deve ser informado.'
                            );
                        }                        
                    }

					$data = array(
						'id_grupo_atributo_rn' => $this->getRequest()->getParam('grupo'),
						'id_atributo_rn' => $atributo,
						'ds_valor' => $valores[$atributo.'_complemento'] == '' ? $valores[$atributo] :
							$valores[$atributo].','.
                            (
                                is_array($valores[$atributo.'_complemento']) ? 
                                implode(',',$valores[$atributo.'_complemento']) : 
                                $valores[$atributo.'_complemento']
                            )
					);

					$Model->save($data);

					if ($tipo == 'QUESTIONARIO') {
						$children = $Model->getChildren($atributo);

						//salva os filhos se existirem e os pais estiverem marcados
						foreach($children as $child) {
							$data = array(
								'id_grupo_atributo_rn' => $this->getRequest()->getParam('grupo'),
								'id_atributo_rn' => $child['id'],
								'ds_valor' => $valores[$atributo]
							);
							$Model->save($data);
						}
					}
				}

				if (
					!empty($limiteMinimoCultivo) 
					&& !empty($limiteMaximoCultivo)
					&& $limiteMinimoCultivo > $limiteMaximoCultivo
				) {
					throw new Exception('"Tempo mínimo de cultivo (dias)" não pode ser maior que "Tempo máximo de cultivo (dias)".');
				}

				$Model->getDefaultAdapter()->commit();
			} catch (Exception $e) {
				$Model->getDefaultAdapter()->rollBack();
                $retorno['erro'] = true;
                $retorno['mensagem'] = $e->getMessage();
			}

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

	public function formusuariosAction() {
		$this->isAjax(true);

		$Grupos = new Produto_Model_Atributogrupos();
		$row = $Grupos->find($this->getRequest()->getParam('id'))->current();

		$this->view->relacionados = $Grupos->getUsuariosRelacionados($this->getRequest()->getParam('id'));
		$this->view->id = $this->getRequest()->getParam('id');
		$this->view->id_produto = $row['id_produto'];
		$this->view->ds_tipo = $this->getRequest()->getParam('ds_tipo');
	}

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

		$retorno = ['erro' => false, 'mensagem' => 'Usuários relacionados com sucesso.'];
		$adapter = Agro_Db_Table_Abstract::getDefaultAdapter();

		try {
            $adapter->beginTransaction();

			$Usuarios = new Produto_Model_AtributoGrupoUsuarios();
			$Usuarios->clearGrupo($this->getRequest()->getParam('id'));

			if (is_array($this->getRequest()->getParam('id_usuario'))) {
				foreach ($this->getRequest()->getParam('id_usuario') as $usuario) {
					$data = array(
						'id_grupo_atributo_rn' => $this->getRequest()->getParam('id'),
						'id_usuario' => $usuario
					);

					$Usuarios->save($data);
				}
			}

            $adapter->commit();
		} catch (Exception $e) {
            $adapter->rollback();
            $retorno = ['erro' => true, 'mensagem' => 'Erro ao relacionar os usuários.'];
		}

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

	public function loadAction() {
		$this->isAjax(true);
		try {
			$Model = $this->getModel();

			$this->view->dados = $Model->find($this->getRequest()->getParam('id'))->current();
		} catch (Exception $e) {
			die($e);
		}
		//$this->getResponse()->setBody(Zend_Json::encode($Row->toArray()));
	}

	public function copiaatributosAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();
		$result = array('execute' => "$.listGrupos($('.formCopiaGrupo #ds_tipo').val());");
		if ($this->getRequest()->isPost()) {
			$Model = $this->getModel();
			$result['status'] = $Model->copiaGrupo($this->getRequest()->getParams());
		}

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

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

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

        try {
            $gruposProduto = [];
            $retorno = [
              'usuariosComVinculoOutroGrupo' => false,
              'mensagem'                     => '',
              'usuarios'                     => $this->getRequest()->getParam('id_usuario'),
              'id'                           => $this->getRequest()->getParam('id')
            ];
            $usuariosConflito = [];

            if (!empty($this->getRequest()->getParam('id_produto'))) {
                $GrupoUsuarios = new Produto_Model_AtributoGrupoUsuarios();
                $tipo = !empty($this->getRequest()->getParam('ds_tipo')) ? $this->getRequest()->getParam('ds_tipo') : '';
                $gruposProduto = $GrupoUsuarios->getUsuariosByProduto($this->getRequest()->getParam('id_produto'),
                  $tipo);
            }

            if (is_array($this->getRequest()->getParam('id_usuario'))) {
                foreach ($this->getRequest()->getParam('id_usuario') as $usuario) {
                    if (!empty($gruposProduto)) {
                        foreach ($gruposProduto as $indice => $grupo) {
                            if ((int) $indice === (int) $this->getRequest()->getParam('id')) {
                                continue;
                            }

                            if (array_key_exists($usuario, $grupo['usuarios'])) {
                                $grupoUsuario = $grupo['usuarios'][$usuario];
                                $nomeUsuario = !empty($grupoUsuario['ds_nome_corretor']) ? $grupoUsuario['ds_nome_corretor'] : $grupoUsuario['ds_nome_preposto'];
                                $usuariosConflito[] = "[{$grupoUsuario['ds_nome_grupo']}] - {$nomeUsuario}.";
                                continue;
                            }
                        }
                    }
                }
            }

            if (!empty($usuariosConflito)) {
                $mensagem = "Os seguintes usuários já possuem configurações em outro grupo deste produto:\n";
                $mensagem .= implode("\n", $usuariosConflito);
                $mensagem .= "\n\nDeseja seguir com o relacionamento dos usuários?";
                $mensagem = strlen($mensagem) > 9995 ? substr($mensagem, 0, 9995) . " ..." : $mensagem;

                $retorno['usuariosComVinculoOutroGrupo'] = true;
                $retorno['mensagem'] = $mensagem;
            }

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

        } catch (Exception $e) {
            $this->getResponse()->setBody($e->getMessage());
        }
    }
}
