<?php

declare(strict_types=1);

class Sistema_ParametrosagronomosresponsaveisController extends Agro_Controller_Action 
{
    protected $_paginator = false;
    protected $_backAfterSave = false;
    protected $camposObrigatorios = [
        'idFuncionario' => 'Agrônomo AgroBrasil',
        'idEstado' => 'Estado / UF',
        'idsCultura' => 'Culturas'
    ];

    public function indexAction(): void
    {
        parent::indexAction();
		$this->view->title = 'Sistema » Cadastro » Parâmetros Agrônomos Responsáveis';	
    }

    public function getModel(): Sistema_Model_ParametrosAgronomosResponsaveis
    {
		return new Sistema_Model_ParametrosAgronomosResponsaveis();
	}

    public function getForm(): Sistema_Form_ParametrosAgronomosResponsaveis
    {
		$this->view->formParametrosAgronomosResponsaveis = new Sistema_Form_ParametrosAgronomosResponsaveis();

		return new Sistema_Form_ParametrosAgronomosResponsaveis();
	}

    public function formAction(): void
    {
        $id = $this->getRequest()->getParam('id');
        
        $this->view->culturas = (new Produto_Model_Culturas())->getCombo(false);
        $this->view->title = 'Sistema » Cadastro » Parâmetros Agrônomos Responsáveis';

        if (!empty($id) && !$this->getRequest()->isPost()) {
            $modelParametros = new Sistema_Model_ParametrosAgronomosResponsaveis();
            $modelParametrosCulturas = new Sistema_Model_ParametrosAgronomosResponsaveisCulturas();

            $parametro = $modelParametros->find($id)->current();

            $culturasSalvas = $modelParametrosCulturas
                ->getByIdParametroAgronomoResponsavel((int) $id);
            
            $this->view->culturasSalvas = [];

            foreach ($culturasSalvas as $a) {
                $this->view->culturasSalvas[] = $a['id_cultura'];
            }
        }

        $this->view->id = $id;

        parent::formAction();
    }

    public function listAction(): void
    {
        $this->_paginator = (bool) $this->getRequest()->getParam('show_paginacao');
	    parent::listAction();
        
        $modelEstado = new Sistema_Model_Estados();
        $modelFuncionario = new Sistema_Model_Funcionarios();
    
        $this->view->estados = $modelEstado->getCombo();
        $this->view->funcionarios = $modelFuncionario->getComboFuncionariosAgronomos();
    }

    public function getFilter(): array
    {
		$where = array();

		if ($this->getRequest()->getParam('id_funcionario')) {
			$where[] = array(
				'field' => 'id_funcionario',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_funcionario')
			);
		}

		if ($this->getRequest()->getParam('id_estado')) {
			$where[] = array(
				'field' => 'id_estado',
				'operator' => 'in',
				'value' => '('.implode(',', $this->getRequest()->getParam('id_estado')).')'
			);
		}

        if ($this->getRequest()->getParam('id_cultura')) {
			$where[] = array(
				'field' => 'id_cultura',
				'operator' => 'in',
				'value' => '('.implode(',', $this->getRequest()->getParam('id_cultura')).')'
			);
		}

		return $where;
	}

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

        $parametros = $this->getRequest()->getParams();

        $adapter = Agro_Db_Table_Abstract::getDefaultAdapter();
        $modelParametrosCulturas = new Sistema_Model_ParametrosAgronomosResponsaveisCulturas();
        $modelParametros = $this->getModel();

        $retorno = ['message' => 'Parâmetro do Agrônomo incluido com sucesso.', 'status' => true];
        
        try {
            $this->validaCamposObrigatorios($parametros);
            
            $adapter->beginTransaction();
            
            if (!empty($parametros['id'])) {
                $culturasVinculadas = $modelParametrosCulturas
                    ->getByIdParametroAgronomoResponsavel((int) $parametros['id']);

                $idsCulturasVinculadas = array_map(function ($row) {
                    return $row['id_cultura'];
                }, $culturasVinculadas->toArray());
                

                $culturasAAdicionar = array_diff($parametros['idsCultura'], $idsCulturasVinculadas);
                $culturasARemover = array_diff($idsCulturasVinculadas, $parametros['idsCultura']);
            } else {
                $parametroAgronomoResponsavel = $modelParametros->fetchAll(
                    $modelParametros
                        ->getData("
                            id_funcionario = {$parametros['idFuncionario']}
                            AND id_estado = {$parametros['idEstado']}
                        ")
                );

                if ($parametroAgronomoResponsavel->count()) {
                    throw new Exception('Já existe parâmetros configurados para este usuário no estado selecionado.');
                }
            }
            
            $culturasAAdicionar = $culturasAAdicionar ?? $parametros['idsCultura'];

            $rowParametro = $this->getModel()->save([
                'id' => $parametros['id'],
                'id_funcionario' => $parametros['idFuncionario'],
                'id_estado' => $parametros['idEstado']
            ]);
            
            if (!empty($culturasARemover)) {
                $modelParametrosCulturas->deleteCulturas((int) $parametros['id'], $culturasARemover);
            }
            
            $modelParametrosCulturas->insertCulturas((int) $rowParametro['id'], $culturasAAdicionar);
            
            $adapter->commit();
        } catch (Exception $e) {
            $adapter->rollback();
            
            $retorno['message'] = $e->getMessage();
            $retorno['status'] = false;

            $this->getResponse()->setHttpResponseCode(406);
        }

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

    public function deleteAction(): void
    {
        $this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

        $rowsAfetadas = $this->getModel()->delete($this->getRequest()->getParam('id'));

        if ($rowsAfetadas) {
            $return['message'] = 'Parâmetro do Agrônomo Responsável excluído com sucesso!';
			$return['status'] = true;
        } else {
            $return['message'] = 'Erro ao excluir Parâmetro do Agrônomo Responsável';
			$return['status'] = false;
        }

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

    private function validaCamposObrigatorios(array $parametros): void
    {
        $messageErro = '';
        
        foreach ($this->camposObrigatorios as $id => $label) {
            if (array_key_exists($id, $parametros) && empty($parametros[$id])) {
                $messageErro .= $messageErro ? ", {$label}" : $label;      
            }
        }
        
        if ($messageErro) {
            throw new Exception("Os seguintes campos não foram preenchidos: {$messageErro}");
        }
    }
}