<?php

class Sistema_Model_Treinamentos extends Agro_Db_Table_Abstract
{
    protected $_schema = 'sistema';
    protected $_name = 'treinamentos';
    protected $_primary = 'id';

    public function getData($where = [])
    {
        $whereTiposVistorias = array_key_exists('id_tipo_vistoria', $where) ? "WHERE {$where['id_tipo_vistoria']}" : '';
        $joinTiposVistorias = "SELECT ttv.id_treinamento,
                                      STRING_AGG (tv.ds_tipo, ', ' ORDER BY tv.ds_tipo) as ds_nomes_tipo_vistorias 
                                 FROM sistema.treinamentos_tipos_vistoria ttv
                                 JOIN sistema.tipos_vistoria AS tv ON tv.id = ttv.id_tipo_vistoria
                                 {$whereTiposVistorias}
                                 GROUP BY ttv.id_treinamento";

        $whereGrupamentosCulturas = array_key_exists('id_grupamento_cultura', $where) ? "WHERE {$where['id_grupamento_cultura']}" : '';
        $joinGrupamentosCulturas = "SELECT ttac.id_treinamento, 
                                           STRING_AGG (gc.ds_nome_grupamento_cultura, ', ' ORDER BY gc.ds_nome_grupamento_cultura) as ds_nomes_grupamento_culturas
                                      FROM sistema.treinamentos_tipo_grupamento_culturas ttac 
                                      JOIN produto.grupamento_culturas AS gc ON gc.id = ttac.id_grupamento_cultura
                                      {$whereGrupamentosCulturas}
                                      GROUP BY ttac.id_treinamento";

        $whereEmpresa = array_key_exists('id_vistoriadores', $where) ? " AND {$where['id_vistoriadores']}" : '';
        $whereEmpresa .= array_key_exists('id_empresas', $where) ? " AND {$where['id_empresas']}" : '';
        $whereEmpresa .= array_key_exists('id_estados', $where) ? " AND {$where['id_estados']}" : '';
        $joinVistoriadores = "SELECT tvf.id_treinamento,
                                     STRING_AGG (fv.ds_nome_funcionario, ', ' ORDER BY fv.ds_nome_funcionario) as ds_nomes_vistoriadores
                                FROM sistema.treinamento_vistorias tvf
                                JOIN sistema.funcionarios AS fv ON fv.id = tvf.id_funcionario
                                JOIN sistema.empresas AS e ON e.id = fv.id_empresa
                                JOIN sistema.municipios AS m ON m.id = e.id_municipio
                                WHERE tvf.fl_ministrante is FALSE
                                {$whereEmpresa}
                                GROUP BY tvf.id_treinamento";

        $joinAgronomos = "SELECT tva.id_treinamento,
                                 STRING_AGG (fa.ds_nome_funcionario, ', ' ORDER BY fa.ds_nome_funcionario) as ds_nomes_agronomos,
                                 ARRAY_AGG(fa.id) as ids_agronomos
                            FROM sistema.treinamento_vistorias tva
                            JOIN sistema.funcionarios AS fa ON fa.id = tva.id_funcionario
                            WHERE tva.fl_ministrante is TRUE
                            GROUP BY tva.id_treinamento";
        
        $joinEmpresas = "SELECT tvf.id_treinamento,
                                    STRING_AGG (distinct e.ds_nome_fantasia, ', ' ORDER BY e.ds_nome_fantasia) as ds_nomes_empresas
                           FROM sistema.treinamento_vistorias tvf
                           JOIN sistema.funcionarios AS fv ON fv.id = tvf.id_funcionario
                           JOIN sistema.empresas AS e ON e.id = fv.id_empresa
                           JOIN sistema.municipios AS m ON m.id = e.id_municipio
                           WHERE tvf.fl_ministrante is FALSE
                           {$whereEmpresa}
                           GROUP BY tvf.id_treinamento ";

        $select = $this->select()->setIntegrityCheck(false);
		$select->from(array('t' => 'sistema.treinamentos'), array('id', "to_char(dt_treinamento,'dd/mm/yyyy') as dt_treinamento", "ds_local_treinamento", "ds_assuntos_abordados"));
        $select->join(array('tipos_vistorias' => new Zend_Db_Expr("($joinTiposVistorias)")), 'tipos_vistorias.id_treinamento = t.id', 'ds_nomes_tipo_vistorias');
        $select->join(array('grupamento_culturas' => new Zend_Db_Expr("($joinGrupamentosCulturas)")), 'grupamento_culturas.id_treinamento = t.id', 'ds_nomes_grupamento_culturas');
        $select->join(array('vistoriadores' => new Zend_Db_Expr("($joinVistoriadores)")), 'vistoriadores.id_treinamento = t.id', 'ds_nomes_vistoriadores');
        $select->join(array('empresas' => new Zend_Db_Expr("($joinEmpresas)")), 'empresas.id_treinamento = t.id', 'ds_nomes_empresas');
       
        if (array_key_exists('id_agronomos', $where)) {
            $select->join(array('agronomos' => new Zend_Db_Expr("($joinAgronomos)")), 'agronomos.id_treinamento = t.id', 'ds_nomes_agronomos');
            $select->where($where['id_agronomos']);
        } else {
            $select->joinLeft(array('agronomos' => new Zend_Db_Expr("($joinAgronomos)")), 'agronomos.id_treinamento = t.id', 'ds_nomes_agronomos');
        }

		$select->where('t.fl_ativo is true');
		$select->where('t.fl_del is false');

        if (array_key_exists('id', $where)) {
            $select->where($where['id']);
        }

        $select->order('t.dt_treinamento desc, t.id desc');
        return $select;
    }

    /**
     * Retorna todos os vistoriadores de um treinamento.
     * 
     * @param int $idTreinamento
     * @return array
     */
    public function getVistoriadoresByTreinamento(int $idTreinamento):? array
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('tv' => 'sistema.treinamento_vistorias'), array('id_funcionario'));
        $select->where("tv.id_treinamento = {$idTreinamento}");
        $select->where("tv.fl_ministrante is false");
        $rs = $this->getAdapter()->fetchAll($select);
        
        $vistoriadores = [];
        foreach ($rs as $value) {
            $vistoriadores[] = $value['id_funcionario'];
        }

        return $vistoriadores;
    }

    /**
     * Retorna todos os agronomos de um treinamento.
     * 
     * @param int $idTreinamento
     * @return array
     */
    public function getAgronomosByTreinamento(int $idTreinamento):? array
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('tv' => 'sistema.treinamento_vistorias'), array('id_funcionario'));
        $select->where("tv.id_treinamento = {$idTreinamento}");
        $select->where("tv.fl_ministrante is true");
        $rs = $this->getAdapter()->fetchAll($select);
        
        $agronomos = [];
        foreach ($rs as $value) {
            $agronomos[] = $value['id_funcionario'];
        }

        return $agronomos;
    }

    /**
     * Retorna todas as empresas de vistoria de um treinamento.
     * 
     * @param int $idTreinamento
     * @return array
     */
    public function getEmpresasByTreinamento(int $idTreinamento):? array
    {
        $select = $this->select()->distinct(true)->setIntegrityCheck(false);
        $select->from(array('tv' => 'sistema.treinamento_vistorias'), null);
        $select->join(["fv" => "sistema.funcionarios"], "fv.id = tv.id_funcionario", ["id_empresa"]);
        $select->where("tv.id_treinamento = {$idTreinamento}");
        $select->where("tv.fl_ministrante is false");
        $rs = $this->getAdapter()->fetchAll($select);
        
        $empresas = [];
        foreach ($rs as $value) {
            $empresas[] = $value['id_empresa'];
        }

        return $empresas;
    }

    /**
     * Retorna todos os tipos de vistorias de um treinamento.
     * 
     * @param int $idTreinamento
     * @return array
     */
    public function getTiposVistoriasByTreinamento(int $idTreinamento):? array
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('ttv' => 'sistema.treinamentos_tipos_vistoria'), array('id_tipo_vistoria'));
        $select->where("ttv.id_treinamento = {$idTreinamento}");
        $rs = $this->getAdapter()->fetchAll($select);

        $tiposVistorias = [];
        foreach ($rs as $value) {
            $tiposVistorias[] = $value['id_tipo_vistoria'];
        }

        return $tiposVistorias;
    }

    /**
     * Retorna todos os tipos de grupamentos de culturas de um treinamento.
     * 
     * @param int $idTreinamento
     * @return array
     */
    public function getTiposGrupamentosCulturasByTreinamento(int $idTreinamento):? array
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('ttgc' => 'sistema.treinamentos_tipo_grupamento_culturas'), array('id_grupamento_cultura'));
        $select->where("ttgc.id_treinamento = {$idTreinamento}");
        $rs = $this->getAdapter()->fetchAll($select);

        $tiposGrupamentosCulturas = [];
        foreach ($rs as $value) {
            $tiposGrupamentosCulturas[] = $value['id_grupamento_cultura'];
        }

        return $tiposGrupamentosCulturas;
    }

    public function save(array $data)
    {
        $row = $this->getRow($data['id']);
        $row->dt_treinamento = Agro_Util::formatDate($data['dt_treinamento'], Zend_Date::W3C);
        $row->ds_local_treinamento = $data['ds_local_treinamento'];
        $row->ds_assuntos_abordados = $data['ds_assuntos_abordados'];
        $idTreinamento = $row->save();

        if (empty($idTreinamento)) {
            throw new Exception("Erro ao salvar o treinamento.");
        }
        
        $this->vincularTreinamentoVistorias($idTreinamento, $data);
        $this->vincularTreinamentosTiposVistoria($idTreinamento, $data);
        $this->vincularTreinamentosTipoGrupamentoCulturas($idTreinamento, $data);
    }

    private function vincularTreinamentoVistorias(int $idTreinamento, array $data)
    {
        $modelTreinamentoVistorias = new Sistema_Model_TreinamentoVistorias();
        $modelTreinamentoVistorias->delete($idTreinamento, 'id_treinamento');
        
        foreach ($data['id_vistoriadores'] as $idVistoriador) {
            $dataVistoriador = [
                'id_funcionario' => $idVistoriador,
                'id_treinamento' => $idTreinamento,
                'fl_ministrante' => false
            ];
            $modelTreinamentoVistorias->save($dataVistoriador);
        }

        foreach ($data['id_agronomos'] as $idAgronomo) {
            $dataAgronomo = [
                'id_funcionario' => $idAgronomo,
                'id_treinamento' => $idTreinamento,
                'fl_ministrante' => true
            ];
            $modelTreinamentoVistorias->save($dataAgronomo);
        }
    }

    private function vincularTreinamentosTiposVistoria(int $idTreinamento, array $data)
    {
        $modelTreinamentosTiposVistorias = new Sistema_Model_TreinamentosTiposVistoria();
        $modelTreinamentosTiposVistorias->delete($idTreinamento, 'id_treinamento');

        foreach ($data['id_tipo_vistoria'] as $idTipoVistoria) {
            $dataTreinamentosTiposVistoria = [
                'id_treinamento' => $idTreinamento,
                'id_tipo_vistoria' => $idTipoVistoria
            ];

            $modelTreinamentosTiposVistorias->save($dataTreinamentosTiposVistoria);
        }
    }

    private function vincularTreinamentosTipoGrupamentoCulturas(int $idTreinamento, array $data)
    {
        $modelTreinamentosTipoGrupamentoCulturas = new Sistema_Model_TreinamentosTipoGrupamentoCulturas();
        $modelTreinamentosTipoGrupamentoCulturas->delete($idTreinamento, 'id_treinamento');

        foreach ($data['id_grupamento_cultura'] as $idGrupamentoCultura) {
            $dataTreinamentosTiposVistoria = [
                'id_treinamento' => $idTreinamento,
                'id_grupamento_cultura' => $idGrupamentoCultura
            ];

            $modelTreinamentosTipoGrupamentoCulturas->save($dataTreinamentosTiposVistoria);
        }


    }
}
