<?php

class Comercializacao_ComercializacaoController extends Agro_Controller_Action
{
    public function getModel()
    {
        return new Comercializacao_Model_Comercializacoes();
    }

    public function ajustecomercializacaoloteAction(): void
    {
        $this->view->form = new Comercializacao_Form_AjusteComercializacaoLote();
        
        if ($this->getRequest()->isPost()) {
			$params = $this->getRequest()->getParams();
            
            try {
                $hierarquias = ['E', 'M', 'U'];
                $colunasData = [
                    'dt_comercializacao_inicio' => 'Data Início Comercialização',
                    'dt_comercializacao_fim' => 'Data Fim Comercialização',
                    'dt_cobertura_inicio' => 'Data Início Vigência',
                    'dt_cobertura_fim' => 'Data Fim Vigência'
                ];

                $idSafra = $params['id_safra'];
                $idsCultura = $params['id_cultura'];
                $idsProduto = $params['id_produto'];
                $hierarquia = $params['radio-btns-hierarquia'];

                if (empty($idSafra) || empty($idsCultura)) {
                    throw new Exception('Necessário selecionar Safra e Cultura.');
                }

                if (!in_array($hierarquia, $hierarquias)) {
                    throw new Exception('Hierarquia não selecionada.');
                }

                if (
                    empty($params['dt_comercializacao_inicio'])
                    && empty($params['dt_comercializacao_fim'])
                    && empty($params['dt_cobertura_inicio'])
                    && empty($params['dt_cobertura_fim'])
                ) {
                    throw new Exception('Nenhuma data informada para realizar ajuste.');
                }

                $datasAjuste = []; 

                foreach ($colunasData as $key => $label) {
                    if (empty($params[$key])) {
                        continue;
                    }

                    $aux = explode('/', $params[$key]);

                    if (count($aux) < 3 && !checkdate($aux[1], $aux[0], $aux[2])) {
                        throw new Exception("Campo {$label} está incorreto.");
                    }

                    $datasAjuste[$key] = date('Y-m-d H:i:s', strtotime(str_replace('/', '-', $params[$key])));
                }
                
                if (empty($datasAjuste)) {
                    throw new Exception('Nenhuma data informada.');
                }

                $modelComercializacao = new Comercializacao_Model_Comercializacoes();

                $comercializacoes = $modelComercializacao->getIdsComercializacaoParaAjuste(
                    $hierarquia,
                    (int) $idSafra,
                    $idsCultura,
                    $idsProduto
                );

                if (empty($comercializacoes)) {
                    throw new Exception('Nenhuma comercialização encontrada.');
                }

                $ids = '';

                foreach ($comercializacoes as $com) {
                    $ids .= !empty($ids) ? ", {$com['id']}" : $com['id']; 
                }
                
                $affectedRows = $modelComercializacao->update($datasAjuste, 'id IN ('. $ids .')');

                if (!$affectedRows) {
                    throw new Exception('Erro ao atualizar comercializações em lote.');
                }

                $this->view->showMessage(MSG_SUCCESS, 'success');
            } catch(Exception $e) {
                $this->view->showMessage($e->getMessage(), 'error');
            }
        }
    }

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

        $mensagem = "Dados salvos com sucesso.";

        $parametros = $this->getRequest()->getParams();
        $parametros['tp_comercializacao'] = Comercializacao_Model_Comercializacoes::TIPO_ORCAMENTO;
        $parametros['ds_nome_comercializacao'] = !empty($parametros['ds_nome_comercializacao']) ? $parametros['ds_nome_comercializacao'] : $parametros['id_proposta'];

        Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

        try {
            $modelMunicipios = new Sistema_Model_Municipios();
            $estado = $modelMunicipios->getEstado($parametros['id_municipio']);

            if (!empty($estado)) {
                $parametros['id_estado'] = $estado['id_estado'];
            }

            if (empty($parametros['id'])) {
                $grupoComercializacao = $this->getGrupo($parametros);

                $parametros['dt_comercializacao_inicio'] = $grupoComercializacao['dt_comercializacao_inicio'];
                $parametros['dt_comercializacao_fim'] = $grupoComercializacao['dt_comercializacao_fim'];
                $parametros['ds_nome_comercializacao'] = $parametros['id_proposta'];
            }

            $idComercializacao = $this->getModel()->save($parametros);

            $parametros['ds_nome_comercializacao'] = "{$parametros['id_proposta']}_{$idComercializacao}";
            $parametros['id'] = $idComercializacao;
            $this->getModel()->save($parametros);

            $modelComercializacoesOrcamentos = new Comercializacao_Model_ComercializacoesOrcamentos();
            $modelComercializacoesOrcamentos->save(
              [
                'id_comercializacao' => $idComercializacao,
                'id_proposta' => $parametros['id_proposta'],
              ]
            );

            Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
        } catch (Exception $exception) {
            $mensagem = 'Erro ao salvar os dados de comercialização:';
            $mensagem .= "\n{$exception->getMessage()}";

            Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
        }

        $this->getResponse()->setBody(Zend_Json::encode(['mensagem' => $mensagem]));
    }

    private function getGrupo(array $parametros)
    {
        $model = $this->getModel();

        $result = $model->grupoOrcamento($parametros);
        if ($result !== false) {
            return $result;
        }

        $result = $model->grupoProponenteUsuario($parametros);
        if ($result !== false) {
            return $result;
        }

        $result = $model->grupoProponente($parametros);
        if ($result !== false) {
            return $result;
        }

        $result = $model->grupoCorretorPreposto($parametros);
        if ($result !== false) {
            return $result;
        }

        $result = $model->grupoMunicipio($parametros);
        if ($result !== false) {
            return $result;
        }

        $result = $model->grupoEstado($parametros);
        if ($result !== false) {
            return $result;
        }

        throw new Exception('Comercializações não configuradas. Entre em contato com a AgroBrasil para melhor esclarecimento.');
    }
}
