<?php

class Seguro_PropostadocumentodigitalizadoController extends Agro_Controller_Action {

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

	public function adicionardocumentosAction()
	{
		$this->isAjax();
		$return = array(
			'message' => '',
			'error' => false,
			'fl_tipo_alterado' => false
		);

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

            $idProposta = !Agro_Util::filterVariable($this->getRequest()->getParam('id_proposta'))
                ? 0
                : (int)$this->getRequest()->getParam('id_proposta');

            if (empty($idProposta)) {
                throw new Exception("ID da proposta não informado.");
            }

            if (empty($_FILES)) {
                throw new Exception("Nenhum documento informado.");
            }

			$model = $this->getModel();
			$model->adicionarDocumentos($idProposta);

			$modelPropostasTipoAssinaturaDocumento = new Seguro_Model_PropostasTipoAssinaturaDocumento();
			$propostaTipoAssinatura = $modelPropostasTipoAssinaturaDocumento->getByProposta($idProposta);

			if (empty($propostaTipoAssinatura) || $propostaTipoAssinatura[0]['tipo_assinatura'] == Seguro_Model_PropostasTipoAssinaturaDocumento::NAO_INFORMADA) {
				$data = ['id_proposta' => $idProposta, 'tipo_assinatura' => Seguro_Model_PropostasTipoAssinaturaDocumento::MANUAL];
				$idPropostaTipoAssinaturaDocumento = $modelPropostasTipoAssinaturaDocumento->save($data);

				if (!$idPropostaTipoAssinaturaDocumento) {
					throw new Exception("Não foi possível alterar o tipo de assinatura de documento.");
				}

				$return['fl_tipo_alterado'] = true;
			}

			Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
			$return['message'] = 'Documento(s) adicionado(s) com sucesso.';
		} catch (Exception $e) {
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
			$return['message'] = $e->getMessage();
			$return['error'] = true;
		}

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

	public function adicionardocumentosemloteAction()
	{
		$this->isAjax();
		$return = array(
			'message' => '',
			'error' => false,
			'fl_tipo_alterado' => false
		);
		
		try {
            if (empty($_FILES)) {
                throw new Exception("Nenhum documento informado.");
            }

			$model = $this->getModel();
			$res = $model->adicionarDocumentosEmLote();

			$return['erros_importacao'] = $res['erros_importacao'] ?? [];

		if (!empty($return['erros_importacao'])) {
    		$return['message'] = $res['todos_arquivos_com_erro'] ? 'Falha ao adicionar documento(s).' : 'Documento(s) adicionado(s), porém foram identificados erros durante o processo.';
		} else {
			$return['message'] = 'Documento(s) adicionado(s) com sucesso.';
		}
			
		} catch (Exception $e) {
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
			$return['message'] = $e->getMessage();
			$return['error'] = true;
		}

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

	public function atualizarstatusAction()
	{
		$this->isAjax();
		$return = array(
			'message' => '',
			'error' => false
		);
		try {
			Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
			$statusDocumentoDigitalizado = new Seguro_Model_PropostaStatusDocumentoDigitalizado();
			$propostaPendenciaDocumento = new Seguro_Model_PropostaPendenciaDocumentoDigitalizado();

			$idProposta = $this->getRequest()->getParam('id_proposta');
			$cdStatus = $this->getRequest()->getParam('cd_status');
			$observacao = $this->getRequest()->getParam('ds_observacao');
			$pendencias = $this->getRequest()->getParam('pendencias');

			if (empty($idProposta)) {
				throw new Exception("ID da proposta não informado.");
			}
			
			if (empty($cdStatus)) {
				throw new Exception("Status não informado.");
			}

			$idStatus = $statusDocumentoDigitalizado->atualizarStatus($idProposta, $cdStatus, $observacao);

			if ($cdStatus == Seguro_Model_PropostaStatusDocumentoDigitalizado::STATUS['DOC_PENDENCIA']) {
				$pendencias = explode(',', $pendencias);

				if (empty($pendencias)) {
					throw new Exception("Ao menos uma pendência deve ser marcada.");
				}

				foreach ($pendencias as $codigoPendencia) {
					$propostaPendenciaDocumento->save([
						'id_proposta_status_documento_digitalizado' => $idStatus,
						'id_pendencia' => $codigoPendencia
					]);
				}
			}

			Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
			$return['message'] = 'Status atualizado com sucesso.';
		} catch (Exception $e) {
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
			$return['message'] = $e->getMessage();
			$return['error'] = true;
		}

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

	public function removerAction()
	{
		$this->isAjax();
		
		$return = array(
			'message' => '',
			'error' => false
		);

		try {
			Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
			$id = $this->getRequest()->getParam('id');
			
			if (empty($id)) {
				throw new Exception("ID do arquivo não informado.");
			}

			$model = $this->getModel();
			$model->delete($id);

			Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
			$return['message'] = 'Arquivo removido com sucesso.';
		} catch (Exception $e) {
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
			$return['message'] = $e->getMessage();
			$return['error'] = true;
		}


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