<?php

class Sistema_Model_Municipios extends Agro_Db_Table_Abstract {
	protected $_schema = 'sistema';
	protected $_name = 'municipios';
	protected $_primary = 'id';
	public $_order = 'ds_nome_municipio';

	public $_columnExcel = array(
		'id' => 'Cod.',
		'ds_nome_municipio' => 'Município',
		'ds_sigla' => 'Estado',
	    'nr_ibge' => 'IBGE',
	    'id_regiao' => 'Região'
	);

	public function save(array $data) {
		$Row = ($data['id'] ? $this->find($data['id'])->current() : $this->createRow());


		if(!$data['id_estado']) {
			$this->setMessage("O campo Estado deve ser preenchido!");
			return false;
		}

		$Row->id_estado = $data['id_estado'];
		$Row->ds_nome_municipio = ($data['ds_nome_municipio'] ? $data['ds_nome_municipio'] : null);
		$Row->ds_latitude = ($data['ds_latitude'] ? $data['ds_latitude'] : null);
		$Row->ds_longitude = ($data['ds_longitude'] ? $data['ds_longitude'] : null);
		$Row->vl_altitude = ($data['vl_altitude'] ? $data['vl_altitude'] : null);
		$Row->vl_area = ($data['vl_area'] ? $data['vl_area'] : null);
		$Row->ds_ano_instalacao = ($data['ds_ano_instalacao'] ? $data['ds_ano_instalacao'] : null);
		$Row->cd_bacen = ($data['cd_bacen'] ? $data['cd_bacen'] : null);
		$Row->nr_ibge = ($data['nr_ibge'] ? $data['nr_ibge'] : null);
		$Row->nr_cep = ($data['nr_cep'] ? $data['nr_cep'] : null);
		$Row->id_regiao = ($data['id_regiao'] ? $data['id_regiao'] : null);
		$Row->ds_regiao_ibge = ($data['ds_regiao_ibge'] ? $data['ds_regiao_ibge'] : null);

		return $Row->save();
	}

	public function getCombo($idEstado=null, $useEmpty=true, $comboChaveValor = false)
    {
        $select = $this->select()->order('ds_nome_municipio');

        if (is_array($idEstado)) {
            $estados = array_map(function ($id) {
                return !Agro_Util::filterVariable($id) ? 0 : (int)$id;
            }, $idEstado);

            $select->where('id_estado IN (' . implode(',', $estados) . ')');
            $select->order('ds_nome_municipio');
        } else if ($idEstado) {
            $select->where('id_estado = ?', !Agro_Util::filterVariable($idEstado) ? 0 : (int)$idEstado);
            $select->order('ds_nome_municipio');
        }

        $rs = $this->fetchAll($select);

        $ret = array();
        if ($rs->count()) {
            if ($useEmpty) {
                $ret[0] = array(
                    'id' => '',
                    'nome' => ''
                );
            }

            foreach ($rs as $Row) {
                if ($comboChaveValor) {
                    $ret[$Row->id] = $Row->ds_nome_municipio;
                } else {
                    $ret[] = array(
                        'id' => $Row->id,
                        'nome' => $Row->ds_nome_municipio
                    );
                }
            }
        }

        return $ret;
    }

	public function getComboSigla($sigla, $useEmpty=true) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('m' => 'sistema.municipios'), array('id', 'ds_nome_municipio'));
		$select->join(array('e' => 'sistema.estados'), 'm.id_estado = e.id', null);
		$select->where('e.ds_sigla = ?', $sigla);
		$select->order('m.ds_nome_municipio');

		$Rs = $this->fetchAll($select);

		$ret = array();
		if ($Rs->count()) {
			if ($useEmpty) {
				$ret[0] = array(
					'id' => '',
					'nome' => ''
				);
			}

			foreach ($Rs as $Row) {
                $ret[] = array(
                    'id' => $Row->id,
                    'nome' => $Row->ds_nome_municipio
                );
			}
		}

		return $ret;
	}

	public function get($idMunicipio) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('m'=>'sistema.municipios'));
		$select->join(array('e'=>'sistema.estados'),'m.id_estado = e.id','ds_sigla');
		$select->where('m.id = ' . $idMunicipio . ' and m.fl_ativo = true');
		$select->order($this->_order);

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

	public function getMunicipiosEstado($uf) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('m' => 'sistema.municipios'));
		$select->join(array('e' => 'sistema.estados'), ' m.id_estado = e.id', '');
		$select->where("e.ds_sigla = '$uf'");
		$select->order('m.ds_nome_municipio');

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

	public function getEstado($idMunicipio) {

		$select = $this->_db->select();
		$select->from(array('m'=>'sistema.municipios'),'id_estado');
		$select->where('m.id = ' . $idMunicipio);

		return $this->_db->fetchRow($select);
	}

	public function getName($id) {
		$Row = $this->find($id)->current();
		return $Row->{$this->_order};
	}

	public function getData($where=false) {
		$select = $this->select();
		$select->setIntegrityCheck(false);

		$select->from(array('m' => 'sistema.municipios'), '*');
		$select->join(array('e' => 'sistema.estados'), 'm.id_estado = e.id', 'ds_sigla');
		$select->joinLeft(array('r' => 'sistema.regioes'), 'm.id_regiao = r.id', 'ds_nome_regiao');
		if ($this->_order) {
			$select->order($this->_order);
		}

		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);
		}

		return $select;
	}

	public function getMunicipios($cep) {
		if ($cep) {
			$municipios = $this->_db->fetchPairs("
				select
					id, ds_nome_municipio
				from
					sistema.municipios
				where
					id_estado = (
						select
							id_estado
						from
							sistema.estados e inner join
							sistema.municipios m on m.id_estado = e.id inner join
							sistema.bairros b on m.id = b.id_municipio inner join
							sistema.cep_logradouros c on c.id_bairro = b.id
						where
							c.nr_cep = '$cep'
					) or
					nr_cep = '$cep'
				order by
					ds_nome_municipio");

			return $municipios;
		}
	}

	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'));
			$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', "ds_nome_bairro as logradouro"));
			$SelectSem->where('m.nr_cep = ?', $cep);

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

			$Row = $this->fetchRow($Select);
			if ($Row) {
				return $Row->toArray();
			} else {
				return false;
			}
		} else {
			return false;
		}
	}

	/**
	 * Retorna o total de municípios cadastrados para o estado informado
	 *
	 * @param int $idEstado
	 * @return int
	 */
	public function getTotalMunicipiosByEstado(int $idEstado): int
	{
		return $this->fetchAll("id_estado = {$idEstado}")->count();
	}
}