package repository;

import java.io.Serializable;
import java.util.List;

import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceException;

import modelo.EnumStatus;
import modelo.ParceiroNegocio;
import service.NegocioException;
import util.jpa.Transactional;
import util.jsf.FacesUtil;

public class ParceiroNegocioRepository implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	@Inject
	private EntityManager manager;
	

	public List<ParceiroNegocio> consulta(){
		return manager.createQuery("from parceiro_negocio", ParceiroNegocio.class).getResultList();
	}
	
	@Transactional
	public ParceiroNegocio guardar(ParceiroNegocio parceiroNegocio) {
		System.out.println(".:: Repository - guardar ::.");
		if (parceiroNegocio.isEditando()) {
			FacesUtil.addInfoMessage("Cadastro atualizado com sucesso!");
		}else {
			FacesUtil.addInfoMessage("Cadastro efetuado com sucesso!");
		}

		//////////////////////////////////////////////////
		// Tratando informação antes de salvar no banco //
		//////////////////////////////////////////////////
		if (parceiroNegocio.getNome() != null) {
			parceiroNegocio.setNome(parceiroNegocio.getNome().toUpperCase());
		}
		
		if (parceiroNegocio.getRg() != null) {
			parceiroNegocio.setRg(parceiroNegocio.getRg().toUpperCase());
		}
		
		if (parceiroNegocio.getOrgaoEmissor() != null) {
			parceiroNegocio.setOrgaoEmissor(parceiroNegocio.getOrgaoEmissor().toUpperCase());
		}
		
		if (parceiroNegocio.getNomeMae() != null) {
			parceiroNegocio.setNomeMae(parceiroNegocio.getNomeMae().toUpperCase());
		}
		
		if(parceiroNegocio.getNomePai() != null) {
			parceiroNegocio.setNomePai(parceiroNegocio.getNomePai().toUpperCase());
		}
		
		if (parceiroNegocio.getEmail() != null) {
			parceiroNegocio.setEmail(parceiroNegocio.getEmail().toLowerCase());
		}
		
		if (parceiroNegocio.getNomeFantasia() != null) {
			parceiroNegocio.setNomeFantasia(parceiroNegocio.getNomeFantasia().toUpperCase());
		}
		
		if (parceiroNegocio.getInscricaoMunicipal() != null) {
			parceiroNegocio.setInscricaoMunicipal(parceiroNegocio.getInscricaoMunicipal().toUpperCase());
		}
		
		if (parceiroNegocio.getInscricaoEstadual() != null) {
			parceiroNegocio.setInscricaoEstadual(parceiroNegocio.getInscricaoEstadual().toUpperCase());
		}
		
		if (parceiroNegocio.getSuframa() != null) {
			parceiroNegocio.setSuframa(parceiroNegocio.getSuframa().toUpperCase());
		}
		
		if (parceiroNegocio.getRua() != null) {
			parceiroNegocio.setRua(parceiroNegocio.getRua().toUpperCase());
		}
		
		if (parceiroNegocio.getNumero() != null) {
			parceiroNegocio.setNumero(parceiroNegocio.getNumero().toUpperCase());
		}
		
		parceiroNegocio.setStatus(EnumStatus.ATIVO);
		
		System.out.println(".:: Nome: "+ parceiroNegocio.getNome()+" ::.");
		System.out.println(".:: TipoRelacionamento: "+ parceiroNegocio.getTipoRelacionamento()+" ::.");
		
		return manager.merge(parceiroNegocio);
		//return null;
	}
	
	public ParceiroNegocio porId(Long id) {
		return manager.find(ParceiroNegocio.class, id);
	}
	
	@Transactional
	public void remover(ParceiroNegocio parceiroNegocio) {
		try {
			parceiroNegocio = porId(parceiroNegocio.getId());
			manager.remove(parceiroNegocio);
			manager.flush();
			
		}catch (PersistenceException e) {
			throw new NegocioException("Iten não pode ser excluido! " + e);
		}
	}
	
	public ParceiroNegocio porDescricao(String descricao) {
		try {
			return manager.createQuery("from parceiro_negocio where upper(nome) = :descricao", ParceiroNegocio.class)
				.setParameter("descricao", descricao.toUpperCase())
				.getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
	}
	
	public ParceiroNegocio verificarDuplicidade (String nome, String CPF, String CNPJ) {
		System.out.println(".:: Repository - verificarDuplicidade ::.");
		try {
			ParceiroNegocio duplicado = null;
			
			if (CPF != null) {
				System.out.println(".:: Repository CPF ::.");
				duplicado = manager.createQuery("from parceiro_negocio where upper(nome) = :nome and cpf = :cpf", ParceiroNegocio.class)
						.setParameter("nome", nome.toUpperCase())
						.setParameter("cpf", CPF)
						.getSingleResult();
			} else if (CNPJ != null) {
				System.out.println(".:: Repository CNPJ ::.");
				duplicado = manager.createQuery("from parceiro_negocio where upper(nome) = :nome and cnpj = :cnpj", ParceiroNegocio.class)
						.setParameter("nome", nome.toUpperCase())
						.setParameter("cnpj", CNPJ)
						.getSingleResult();
			}			
			return duplicado;
			
		} catch (NoResultException e) {
			return null;
		}
	}
	
	@Transactional
	public List<ParceiroNegocio> porNome(String nome) {
		return this.manager.createQuery("from parceiro_negocio where upper(nome) like :nome", ParceiroNegocio.class)
				.setParameter("nome", nome.toUpperCase() + "%")
				.getResultList();
	}
	
	
}
