<?php
class Sistema_Model_Ceps extends Agro_Db_Table_Abstract {
	protected $_schema = 'sistema';
	protected $_name = 'cep_logradouros';
	protected $_primary = 'id';

	public $_columnExcel = array(
		'id' => 'Cod.',
		'ds_nome_logradouro' => 'Logradouro',
	    'nr_cep' => 'CEP',
	    'ds_nome_bairro' => 'Bairro',
    	'ds_nome_municipio' => 'Município',
		'ds_sigla' => 'Estado'
	);

	public function save(array $data) {
		try {
			$Row = $this->getRow($data['id']);

			$Row->id_bairro = $data['id_bairro'] ? $data['id_bairro'] : null;
			$Row->ds_nome_logradouro = $data['ds_nome_logradouro'];
			$Row->tp_logradouro = $data['tp_logradouro'];
			$Row->nr_cep = str_replace('-','',$data['nr_cep']);

			return $Row->save();
		} catch (Exception $e) {
			switch ($e->getCode()) {
				case 23505:
					$this->setMessage('Não é possível duplicar um CEP já existente.');
					break;
			}

			return false;
		}
	}

	public function getData($where) {
		$SelectCom = $this->select()->distinct(true)->setIntegrityCheck(false);
		$SelectCom->from(array('m'=>'sistema.municipios'), array('id as id_municipio', 'ds_nome_municipio'));
		$SelectCom->join(array('e'=>'sistema.estados'), 'm.id_estado = e.id', array('id as id_estado', 'ds_nome_estado', 'ds_sigla'));
		$SelectCom->join(array('b'=>'sistema.bairros'), 'b.id_municipio = m.id', array('ds_nome_bairro', 'id as id_bairro'));
		$SelectCom->join(array('c'=>'sistema.cep_logradouros'), 'c.id_bairro = b.id', array('id', 'ds_nome_logradouro', 'tp_logradouro','nr_cep', 'fl_ativo'));
		//$SelectCom->where('c.nr_cep = ?', $cep);

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

					$SelectCom->where("$field $operator ?", $value);
				} else {
					$SelectCom->where('c.nr_cep = ?', $clause['value']);
				}
			}
		}

		$SelectSem = $this->select()->distinct(true)->setIntegrityCheck(false);
		$SelectSem->from(array('m'=>'sistema.municipios'), array('id as id_municipio', 'ds_nome_municipio'));
		$SelectSem->join(array('e'=>'sistema.estados'), 'm.id_estado = e.id', array('id as id_estado', 'ds_nome_estado', 'ds_sigla'));
		$SelectSem->joinLeft(array('b'=>'sistema.bairros'), 'b.id_municipio = m.id', array('ds_nome_bairro', 'id as id_bairro'));
		$SelectSem->joinLeft(array('c'=>'sistema.cep_logradouros'), 'c.id_bairro = b.id', array('id', 'ds_nome_logradouro', 'tp_logradouro','m.nr_cep', 'fl_ativo'));
//		$SelectSem->where('m.nr_cep = ?', $cep);

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

					$SelectSem->where("$field $operator ?", $value);
				} else {
					$SelectSem->where('m.nr_cep = ?', $clause['value']);
				}
			}
		}

		$SelectDis = $this->select()->distinct(true)->setIntegrityCheck(false);
		$SelectDis->from(array('m'=>'sistema.municipios'), array('id as id_municipio', 'ds_nome_municipio'));
		$SelectDis->join(array('e'=>'sistema.estados'), 'm.id_estado = e.id', array('id as id_estado', 'ds_nome_estado', 'ds_sigla'));
		$SelectDis->join(array('d'=>'sistema.distritos'), 'd.id_municipio = m.id', array('ds_nome_distrito as ds_nome_bairro', 'id as id_bairro'));
		$SelectDis->joinLeft(array('b'=>'sistema.bairros'), 'b.id_municipio = m.id and b.id=999999', null); //utilizado 9999 para nunca entrar nesse join. Esse join só serve para contemplar as colunas para o Union com os demais selects
		$SelectDis->joinLeft(array('c'=>'sistema.cep_logradouros'), 'c.id_bairro = b.id', array('id', 'ds_nome_logradouro', 'tp_logradouro','d.nr_cep', 'fl_ativo'));
		//$SelectDis->where('d.nr_cep = ?', $cep);

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

					$SelectDis->where("$field $operator ?", $value);
				} else {
					$SelectDis->where('d.nr_cep = ?', $clause['value']);
				}
			}
		}

		$Select = $this->select()->union(array($SelectCom, $SelectSem, $SelectDis));

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

		return $Select;
	}


	public function verificaCepUnico($municipio){
		if($municipio){
			$nr_cep = $this->_db->fetchOne("select nr_cep from sistema.municipios where	id=".$municipio);
			if($nr_cep){
				return true;
			}
		} else {
			return false;
		}
	}

	public function verificaCep($cep){
		if($cep){
			$nr_cep = $this->_db->fetchOne("select nr_cep from sistema.cep_logradouros where nr_cep=".$cep);
			if(!$nr_cep){
				return true;
			}else{
				return false;
			}
		} else {
			return false;
		}
	}

	public function getCep($data,$cepUnico=false) {

		if (is_array($data) or $cepUnico) {

			if(!$cepUnico){
				$Rs = $this->_db->fetchAll("
					select
						cl.tp_logradouro || ' ' || cl.ds_nome_logradouro as ds_nome_logradouro,
						b.ds_nome_bairro,
						m.ds_nome_municipio,
						cl.nr_cep
					from
						sistema.cep_logradouros cl inner join
						sistema.bairros b on cl.id_bairro = b.id inner join
						sistema.municipios m on b.id_municipio = m.id
					where
						cl.ds_nome_logradouro ilike '{$data['logradouro']}%' and
						m.id=".$data['id_municipio']."
					order by
						cl.ds_nome_logradouro, cl.nr_cep
				");
			} else {
				$Rs = $this->_db->fetchAll("select ds_nome_municipio, nr_cep from sistema.municipios where id=".$data);
			}

			return $Rs;
		}
	}

	public function getEndereco($cep) {
		if ($cep) {
			$cep = str_replace('-', '', $cep);

			$SelectCom = $this->select()->distinct(true)->setIntegrityCheck(false);
			$SelectCom->from(array('m'=>'sistema.municipios'), array('id as id_municipio', 'ds_nome_municipio'));
			$SelectCom->join(array('e'=>'sistema.estados'), 'm.id_estado = e.id', array('id as id_estado', 'ds_nome_estado', 'ds_sigla'));
			$SelectCom->join(array('b'=>'sistema.bairros'), 'b.id_municipio = m.id', array('ds_nome_bairro as bairro'));
			$SelectCom->join(array('c'=>'sistema.cep_logradouros'), 'c.id_bairro = b.id', array('ds_nome_logradouro as logradouro', 'tp_logradouro'));
			$SelectCom->where('c.nr_cep = ?', $cep);

			$SelectSem = $this->select()->distinct(true)->setIntegrityCheck(false);
			$SelectSem->from(array('m'=>'sistema.municipios'), array('id as id_municipio', 'ds_nome_municipio'));
			$SelectSem->join(array('e'=>'sistema.estados'), 'm.id_estado = e.id', array('id as id_estado', 'ds_nome_estado', 'ds_sigla'));
			$SelectSem->joinLeft(array('b'=>'sistema.bairros'), 'b.id_municipio = m.id', array('ds_nome_bairro as bairro'));
			$SelectSem->joinLeft(array('c'=>'sistema.cep_logradouros'), 'c.id_bairro = b.id', array('ds_nome_logradouro as logradouro', 'tp_logradouro'));
			$SelectSem->where('m.nr_cep = ?', $cep);

			$SelectDis = $this->select()->distinct(true)->setIntegrityCheck(false);
			$SelectDis->from(array('m'=>'sistema.municipios'), array('id as id_municipio', 'ds_nome_municipio'));
			$SelectDis->join(array('e'=>'sistema.estados'), 'm.id_estado = e.id', array('id as id_estado', 'ds_nome_estado', 'ds_sigla'));
			$SelectDis->join(array('d'=>'sistema.distritos'), 'd.id_municipio = m.id', array('ds_nome_distrito as bairro'));
			$SelectDis->joinLeft(array('b'=>'sistema.bairros'), 'b.id_municipio = m.id and b.id=999999', null); //utilizado 9999 para nunca entrar nesse join. Esse join só serve para contemplar as colunas para o Union com os demais selects
			$SelectDis->joinLeft(array('c'=>'sistema.cep_logradouros'), 'c.id_bairro = b.id', array('ds_nome_logradouro as logradouro', 'tp_logradouro'));
			$SelectDis->where('d.nr_cep = ?', $cep);

			$Select = $this->select()->union(array($SelectCom, $SelectSem, $SelectDis));

			$Row = $this->fetchRow($Select);

			if ($Row) {
				return $Row->toArray();
			} else {
				return false;
			}
		} else {
			return false;
		}
	}

}
