<?php

require_once 'StatusController.php';
require_once 'TipostatusController.php';

class Sistema_CorretorperiodocadastroController extends Agro_Controller_Action
{
    private function criarAgendamentoValidacao($datas = array())
    {
        $datas = array_unique($datas);

        foreach ($datas as $data) {
            $data = date('Y-m-d', strtotime("{$data} +1 days"));
            Agro_Util::generateAtscript("fimperiodocadastroanual.php", [], "01:00am {$data}");
        }
    }

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

        $parametros = $this->getRequest()->getParams();
        $modelPeriodoCadastro = $this->getModel();
        $modelStatus = new Sistema_Model_Status();
        $modelCorretor = new Sistema_Model_Corretores();

        $statusPendencia = $modelStatus->getIdStatus(
          Sistema_Model_Status::CORRETOR_AGUARDANDO_PENDENCIA, Sistema_Model_Tipostatus::CORRETOR
        );

        $statusConcluido = $modelStatus->getIdStatus(
          Sistema_Model_Status::CORRETOR_CONCLUIDO_FINALIZADO, Sistema_Model_Tipostatus::CORRETOR
        );

        $periodoCorretores = $modelPeriodoCadastro->fetchAll("dt_fim = '{$parametros['data']}'", 'fl_cadastro_inalterado is false')->toArray();

        foreach ($periodoCorretores as $periodoCorretor) {
            $dadosCorretor = $modelCorretor->getRow($periodoCorretor['id_corretor'])->toArray();

            if ($dadosCorretor['id_status'] !== $statusConcluido) {
                $dadosCorretor['id_status'] = $statusPendencia;
                $modelCorretor->salvarCorretor($dadosCorretor);
            }
        }
    }

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

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

        $retorno = ['erro' => false, 'mensagem' => 'Importação realizada com sucesso.', 'erros' => []];
        $registros = [];

        $adapter = new Zend_File_Transfer_Adapter_Http();
        $adapter->setDestination(APPLICATION_PATH . '/upload_files/temp/');
        $adapter->addValidator('Extension', false, ['csv']);

        $file = $adapter->getFileInfo();
        $nomeArquivo = $file['arquivo']['name'];

        if (!$adapter->isValid()) {
            $retorno['erro'] = true;
            $retorno['mensagem'] = 'Formato de arquivo inválido (formato aceito: .csv).';

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

            return false;
        }

        if (!$adapter->receive($nomeArquivo)) {
            $retorno['erro'] = true;
            $retorno['mensagem'] = 'Erro ao receber o arquivo de importação dos corretores.';

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

            return false;
        }

        $arquivo = fopen(APPLICATION_PATH . '/upload_files/temp/' . $nomeArquivo, 'r');

        while (($dados = fgetcsv($arquivo, 0, ';')) != false) {
            if (count($dados) !== 3) {
                $mensagem = "Importação inválida. O arquivo deve conter 3 colunas com o cabeçalho/dados na seguinte ordem:";
                $mensagem .= "\n1ª - id_corretor";
                $mensagem .= "\n2ª - dt_inicio";
                $mensagem .= "\n3ª - prazo_cadastro";


                $retorno['erro'] = true;
                $retorno['mensagem'] = $mensagem;

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

                return false;
            }

            $dados[0] = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $dados[0]);

            if (trim($dados[0]) === 'id_corretor') {
                continue;
            }

            $registros[] = [
              'id_corretor'    => $dados[0],
              'dt_inicio'      => $dados[1],
              'prazo_cadastro' => $dados[2],
            ];
        }

        fclose($arquivo);

        $datasAgendamento = [];
        $model = $this->getModel();
        $modelCorretores = new Sistema_Model_Corretores();
        $modelPrepostosCadastroAnual = new Sistema_Model_PrepostosPeriodoCadastroAnual();

        foreach ($registros as $registro) {
            Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

            try {
                if (empty($registro['id_corretor'])) {
                    throw new Exception('ID do corretor não informado.', 1);
                }

                if ((int)$registro['id_corretor'] === 0) {
                    throw new Exception('ID do corretor inválido.', 1);
                }

                if (empty($registro['dt_inicio'])) {
                    throw new Exception('Data de início não informada.', 1);
                }

                if (!Agro_Util::isDate($registro['dt_inicio'])) {
                    throw new Exception('Data de início inválida.', 1);
                }

                $registro['dt_fim'] = Agro_Util::somarData($registro['dt_inicio'], 0, 0, $registro['prazo_cadastro']);
                $registro['dt_inicio_formatada'] = $registro['dt_inicio'];
                $registro['dt_inicio'] = date('Y-m-d', strtotime(str_replace('/', '-', $registro['dt_inicio'])));
                $registro['fl_cadastro_inalterado'] = $registro['fl_atualizacao_iniciada'] = false;

                if (empty($registro['prazo_cadastro'])) {
                    throw new Exception('Prazo de cadastro não informado.', 1);
                }

                if (!is_int((int)$registro['prazo_cadastro'])) {
                    throw new Exception('Prazo de cadastro inválido.', 1);
                }

                $rowCorretor = $modelCorretores->find($registro['id_corretor'])->current();

                if (empty($rowCorretor)) {
                    throw new Exception('Nenhum corretor encontrado com este ID.', 1);
                }

                $rowCorretor = $rowCorretor->toArray();

                if ((int)$rowCorretor['id_status'] !== Sistema_Model_Corretores::ID_STATUS_CONCLUIDO_FINALIZADO) {
                    $mensagem = 'Corretor já encontra-se com atualização cadastral em andamento ou em outro tipo de';
                    $mensagem .= ' andamento individual.';
                    throw new Exception($mensagem, 1);
                }

                $registrosCorretor = $model->getByCorretor($registro['id_corretor'])->toArray();

                foreach ($registrosCorretor as $corretor) {
                    if (Agro_Util::datesOverlap(
                      $corretor['dt_inicio'],
                      $corretor['dt_fim'],
                      $registro['dt_inicio'],
                      $registro['dt_fim'])
                    ) {
                        $model->delete($corretor['id']);
                    }
                }

                $model->save($registro);
                $dataHoje = date('Y-m-d');

                if (Agro_Util::checkBetweenDatas($dataHoje, $registro['dt_inicio'], $registro['dt_fim'])) {
                    $modelCorretores->salvarCorretor([
                        'id' => $registro['id_corretor'],
                        'id_status' => Sistema_Model_Corretores::ID_STATUS_ATUALIZACAO_CADASTRO
                    ]);

                    $modelPrepostosCadastroAnual->salvarSublogins($registro, $modelCorretores);
                }

                if (!Agro_Util::validaDataInicioFim($dataHoje, $registro['dt_fim'])) {
                    throw new Exception('Prazo de cadastro informado já expirado.', 1);
                }

                $datasAgendamento[] = $registro['dt_fim'];

                Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
            } catch (Exception $erro) {
                $registro['erro'] = $erro->getCode() === 1 ? $erro->getMessage() : 'Erro ao importar o corretor.';

                $retorno['erro'] = true;
                $retorno['erros'][] = $registro;

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

        $this->criarAgendamentoValidacao($datasAgendamento);

        if ($retorno['erro'] === true) {
            $retorno['mensagem'] = 'Importação realizada com sucesso. Algumas linhas não foram importadas, sendo o motivo';
            $retorno['mensagem'] .= ' apresentado na tela.';
        }

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

        return true;
    }

    public function indexAction()
    {
        parent::indexAction();
        $this->view->title = 'Sistema » Rotinas » Cadastro Anual de Corretores';
    }
}
