<?php

class Sistema_Model_Assessorias extends Agro_Db_Table_Abstract {
    const TP_COMISSAO_FIXA = 'F';
    const TP_COMISSAO_PROPORCIONAL = 'P';

    const TP_TIPO_ASSESSORIA = 'A';
    const TP_TIPO_CO_CORRETOR = 'C';

	protected $_schema = 'sistema';
	protected $_name = 'assessorias';
	protected $_primary = 'id';
	public $_order = array('ds_nome_assessoria');

	public function save(array $data) { 
		$Users = new Sistema_Model_Usuarios();

		$this->getDefaultAdapter()->beginTransaction();

		try {
			$data['tp_usuario'] = 'A';
			$idUser = $Users->save($data);

            if ($idUser) {
                $Row = $this->getRow($data['id']);
                $Row->id_usuario = $idUser ? $idUser : $Row->id_usuario;
                $Row->cpf_cnpj = $data['cpf_cnpj'];
                $Row->ds_nome_assessoria = $data['ds_nome_assessoria'];
                $Row->ds_email = $data['ds_email'];
                $Row->ds_telefone = $data['ds_telefone'];
                $Row->tp_tipo = $data['tp_tipo'];
                $Row->tp_comissao = !empty($data['tp_comissao']) ? $data['tp_comissao'] : (!empty($Row->tp_comissao) ? $Row->tp_comissao : 'F');

                if ($Row->tp_tipo === self::TP_TIPO_ASSESSORIA) {
                    $Row->tp_comissao = self::TP_COMISSAO_FIXA;
                }

                if(!$data['id']) {
                    $Row->fl_ativo = '0';
                }

                $Row->save();

                $this->getDefaultAdapter()->commit();
                return $Row->id;
            }  else {
                $this->setMessage($Users->getMessages());
                $this->getDefaultAdapter()->rollBack();
                return false;
            }
		} catch (Exception $e) {
			$this->getDefaultAdapter()->rollBack();
			$this->setMessage($e->getMessage());
			return false;
		}
	}

	public function getData($where) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('sa' => 'sistema.assessorias'), array('id','id_usuario','ds_nome_assessoria','cpf_cnpj','ds_email','fl_ativo','ds_telefone'));
		$select->joinLeft(array('sae' => 'sistema.assessorias_enderecos'), 'sae.id_assessoria = sa.id and sae.fl_principal = true', array(
			'ds_endereco_rua','ds_endereco_nro','ds_endereco_bairro','ds_endereco_cep','ds_endereco_complemento'));
		$select->joinLeft(array('sm' => 'sistema.municipios'), 'sm.id = sae.id_municipio', 'ds_nome_municipio');
		$select->joinLeft(array('se' => 'sistema.estados'), 'se.id = sm.id_estado', 'ds_sigla');

		if (is_array($where)) {
			foreach ($where as $clause) {
				if (is_array($clause)) {
					$field = $clause['field'];
					$operator = $clause['operator'];
					$value = $clause['value'];

					$select->where("$field $operator ?", $value);
				} else {
					$select->where($clause, '');
				}
			}
		} elseif ($where != '') {
			$select->where($where);
		}

		if ($this->_order) {
			$select->order($this->_order);
		}

		return $select;
	}

	/**
	* Busca enderecos de uma assessoria
	*
	* @param int $assessoria
	* @return object
	*/
	public function getEnderecos($assessoria) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('e' => 'sistema.assessorias_enderecos'), array('id', 
			'ds_endereco_rua', 'ds_endereco_nro', 'ds_endereco_bairro', 'ds_endereco_cep', 'ds_endereco_complemento', 'fl_principal'));
		$select->join(array('m' => 'sistema.municipios'), 'e.id_municipio = m.id and e.fl_ativo = true', 'ds_nome_municipio');
		$select->join(array('u' => 'sistema.estados'), 'm.id_estado = u.id and m.fl_ativo = true', 'ds_nome_estado');
		$select->where('e.id_assessoria = ?', $assessoria);
		$select->where('u.fl_ativo = true');

		return $this->fetchAll($select);
	}

	public function getCorretoresSubloginsVinculados(array $where)
    {
        $camposCorretor = [
            'sa.cpf_cnpj',
            'sa.ds_nome_assessoria',
            'sc.ds_nome_corretor as nome_vinculado',
            'sac.vl_percentual as valor_percentual',
        ];

        $selectCorretor = $this->select()->setIntegrityCheck(false);
        $selectCorretor->from(['sa' => "{$this->_schema}.{$this->_name}"], $camposCorretor);
        $selectCorretor->join(['sac' => 'sistema.assessorias_corretores'], 'sac.id_assessoria = sa.id', false);
        $selectCorretor->join(['sc' => 'sistema.corretores'], 'sc.id = sac.id_corretor', false);

        $camposSublogin = [
            'sa.cpf_cnpj',
            'sa.ds_nome_assessoria',
            'sp.ds_nome_preposto as nome_vinculado',
            'sap.vl_percentual as valor_percentual',
        ];

        $selectSublogin = $this->select()->setIntegrityCheck(false);
        $selectSublogin->from(['sa' => "{$this->_schema}.{$this->_name}"], $camposSublogin);
        $selectSublogin->join(['sap' => 'sistema.assessorias_prepostos'], 'sap.id_assessoria = sa.id', false);
        $selectSublogin->join(['sp' => 'sistema.prepostos'], 'sp.id = sap.id_preposto', false);

        $selectUnion = $this->select()->setIntegrityCheck(false);
        $selectUnion->union([$selectCorretor, $selectSublogin]);
        $selectUnion->order('ds_nome_assessoria');
        $selectUnion->order('nome_vinculado');

        foreach ($where as $clause) {
            $field = $clause['field'];
            $operator = $clause['operator'];
            $value = $clause['value'];

            $selectCorretor->where("$field $operator ?", $value);
            $selectSublogin->where("$field $operator ?", $value);
        }

        return $this->fetchAll($selectUnion);
    }
}