/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.bean;

import java.io.Serializable;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.model.SelectItem;

import sistemacilt.dao.CheckListDao;
import sistemacilt.dao.LacreDao;

import com.model.CheckListModel;

/**
 *
 * @author Lucas
 */
@SuppressWarnings({ "rawtypes", "unchecked" })
public class CheckList implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private CheckListModel checkListObj;
	
    private String dataCadastro2;
    private String pesquisaCod;
    private String mensagemPesquisa;
    private String mensagemCadastro;
    private boolean habilitaMensagemPesquisa = false;
    private boolean habilitaMensagemCadastro = false;
    private boolean gravarLacre;
    
    private boolean habilitaAlterar = false;
    private boolean habilitaExcluir = false;
    
    @PostConstruct
    public void init(){
    	this.setCheckListObj(new CheckListModel());
    }
   
    public String getPesquisaCod() {
        return pesquisaCod;
    }

    public void setPesquisaCod(String pesquisaCod) {
        this.pesquisaCod = pesquisaCod;
    }

    public String getMensagemPesquisa() {
        return mensagemPesquisa;
    }

    public void setMensagemPesquisa(String mensagemPesquisa) {
        this.mensagemPesquisa = mensagemPesquisa;
    }

    public String getMensagemCadastro() {
        return mensagemCadastro;
    }

    public void setMensagemCadastro(String mensagemCadastro) {
        this.mensagemCadastro = mensagemCadastro;
    }

    public boolean isHabilitaMensagemPesquisa() {
        return habilitaMensagemPesquisa;
    }

    public void setHabilitaMensagemPesquisa(boolean habilitaMensagemPesquisa) {
        this.habilitaMensagemPesquisa = habilitaMensagemPesquisa;
    }

    public boolean isHabilitaMensagemCadastro() {
        return habilitaMensagemCadastro;
    }

    public void setHabilitaMensagemCadastro(boolean habilitaMensagemCadastro) {
        this.habilitaMensagemCadastro = habilitaMensagemCadastro;
    }

    public String getDataCadastro2() {
        return dataCadastro2;
    }

    public void setDataCadastro2(String dataCadastro2) {
        this.dataCadastro2 = dataCadastro2;
    }

    public boolean isGravarLacre() {
        return gravarLacre;
    }

    public void setGravarLacre(boolean gravarLacre) {
        this.gravarLacre = gravarLacre;
    }

    public boolean isHabilitaAlterar() {
        return habilitaAlterar;
    }

    public void setHabilitaAlterar(boolean habilitaAlterar) {
        this.habilitaAlterar = habilitaAlterar;
    }

    public boolean isHabilitaExcluir() {
        return habilitaExcluir;
    }

    public void setHabilitaExcluir(boolean habilitaExcluir) {
        this.habilitaExcluir = habilitaExcluir;
    }       
    
	public CheckListModel getCheckListObj() {
		return checkListObj;
	}

	public void setCheckListObj(CheckListModel checkListObj) {
		this.checkListObj = checkListObj;
	}

	public ArrayList<SelectItem> getComboLacre() throws SQLException, ClassNotFoundException {
        ArrayList lista = new ArrayList();
        LacreDao dao = new LacreDao();
        List<Lacre> minhaLista = dao.getListaEditavel();
        lista.add(new SelectItem(null, "Selecione o lacre"));
        for (Lacre l1 : minhaLista) {
            lista.add(new SelectItem(l1.getIdLacre(), l1.getIdLacre()));
        }
        return lista;
    }

    public void carregaDadosLacre() throws SQLException, ClassNotFoundException, ParseException {
        dataAtual();
        if (!this.checkListObj.getIdLacre().equals("")) {
            LacreDao dao = new LacreDao();
            List<Lacre> listaDelacre = dao.getListaPorIdLacre(this.checkListObj.getIdLacre());

            for (Lacre lacre : listaDelacre) {
            	this.checkListObj.setVinculacao(lacre.getVinculacao());
            	this.checkListObj.setModelo(lacre.getModelo());
            	this.checkListObj.setModulo(lacre.getIdModulo());
            	this.checkListObj.setChip1(lacre.getChip1());
            	this.checkListObj.setChip2(lacre.getChip2());
            }
            this.habilitaMensagemPesquisa = false;
            this.mensagemPesquisa = "";

        } else {
            this.habilitaMensagemPesquisa = true;
            this.mensagemPesquisa = "* Por favor escolha o ID Trava!";

        }
    }

    public void carregaDadosLacre2() throws SQLException, ClassNotFoundException, ParseException {
        dataAtual();
        if (!this.checkListObj.getIdLacre().equals("")) {
            LacreDao dao = new LacreDao();
            List<Lacre> listaDelacre = dao.getListaPorIdLacre(this.checkListObj.getIdLacre());

            for (Lacre lacre : listaDelacre) {
            	this.checkListObj.setVinculacao(lacre.getVinculacao());
            	this.checkListObj.setModelo(lacre.getModelo());
            	this.checkListObj.setModulo(lacre.getIdModulo());
            	this.checkListObj.setChip1(lacre.getChip1());
            	this.checkListObj.setChip2(lacre.getChip2());
            }
            this.habilitaMensagemPesquisa = false;
            this.mensagemPesquisa = "";

        } else {
            this.habilitaMensagemPesquisa = true;
            this.mensagemPesquisa = "* Por favor escolha o ID Trava!";

        }
    }

    public ArrayList<SelectItem> getComboDefeito() {
        ArrayList lista = new ArrayList();
        lista.add(new SelectItem(null, "Selecione o defeito"));
        lista.add(new SelectItem("Abertura manual", "Abertura manual"));
        lista.add(new SelectItem("Bateria", "Bateria"));
        lista.add(new SelectItem("Flauta", "Flauta"));
        lista.add(new SelectItem("GPS", "GPS"));
        lista.add(new SelectItem("GPRS", "Dados(GPRS)"));
        lista.add(new SelectItem("Motor", "Motor"));
        lista.add(new SelectItem("Trava torre direita", "Trava torre direita"));
        lista.add(new SelectItem("Trava torre esquerda", "Trava torre esquerda"));
        lista.add(new SelectItem("Outros defeitos", "Outros defeitos"));
        lista.add(new SelectItem(null, "Sem defeitos"));
        return lista;
    }

    public void dataAtual() throws ParseException {
        SimpleDateFormat spf = new SimpleDateFormat("dd/MM/yyyy");
        String data = spf.format(new java.sql.Date(System.currentTimeMillis()).getTime());
        this.checkListObj.setDataCadastro(new java.sql.Date(spf.parse(data).getTime()));
        this.dataCadastro2 = spf.format(this.checkListObj.getDataCadastro());
    }

    public List<CheckListModel> getListaSimples() throws SQLException, ClassNotFoundException {
        CheckListDao dao = new CheckListDao();
        List<CheckListModel> listaDeCheck = dao.getListaSimples();      
        return listaDeCheck;
    }

    public String novoCheck() {
        limparCampos();
        limparMensagens();
        return "NovoCheckList";
    }
    
    public String novoCheckCentral() {
        limparCampos();
        limparMensagens();
        return "NovoCheckListCentral";
    }

    public String cancelarNovoCheck() {
        limparCampos();
        limparMensagens();
        return "CheckListCilLock";
    }
    
    public String cancelarNovoCheckCentral() {
        limparCampos();
        limparMensagens();
        return "CheckListCilLockCentral";
    }

	public void limparCampos() {
		this.checkListObj = new CheckListModel();
		this.gravarLacre = false;
		this.dataCadastro2 = "";
	}

    public void limparMensagens() {
        this.mensagemCadastro = "";
        this.mensagemPesquisa = "";
        this.habilitaMensagemCadastro = false;
        this.habilitaMensagemPesquisa = false;
        cancelaAlteracao();
        cancelaExcluir();
    }

    public void adicionar() throws ParseException {
        SimpleDateFormat spf = new SimpleDateFormat("dd/MM/yyyy");
        this.checkListObj.setDataCadastro(spf.parse(dataCadastro2));
        try {
            if (this.checkListObj.getCondicao().equals("")) {
            	this.checkListObj.setCondicao("VERMELHO");
            }
            
            CheckListDao dao = new CheckListDao();
            dao.adicionar(this.checkListObj);
            if (this.gravarLacre == true) {
                desativarLacre();
            }
            this.habilitaMensagemCadastro = true;
            this.mensagemCadastro = "Check List adicionado com sucesso!";
        } catch (Exception e) {
            this.habilitaMensagemPesquisa = true;
            this.mensagemPesquisa = "Problema para adicionar o CheckList" + e;
        }
    }

    public void desativarLacre() {
        try {
            String statusLacre = "";
            Lacre lacre = new Lacre();
            if (this.checkListObj.getCondicao().equals("BRANCO")) {
                statusLacre = "ESTOQUE";
            } else if (this.checkListObj.getCondicao().equals("VERMELHO")) {
                statusLacre = "MANUTENCAO";
            } else if (this.checkListObj.getCondicao().equals("CINZA")) {
                statusLacre = "ESTOQUE";
            } else if (this.checkListObj.getCondicao().equals("PRETO")) {
                statusLacre = "DESCARTE";
            }
            lacre.setarLacre(this.checkListObj.getIdLacre(), statusLacre, this.checkListObj.getVinculacao(), "");
        } catch (Exception e) {
            this.habilitaMensagemPesquisa = true;
            this.mensagemPesquisa = "Problema na ativação do Lacre" + e;
        }
    }

    public String formatoDeData(final Date data) {
        SimpleDateFormat spf = new SimpleDateFormat("dd/MM/yyyy");
        return spf.format(data);
    }

    public String salvarCheckList() throws SQLException, ClassNotFoundException, ParseException {
        if (verificaPreenchimento()) {
            carregaDadosLacre2();
            adicionar();
            return "CheckListCilLock";
        } else {
            return "NovoCheckList";
        }
    }
    
     public String salvarCheckListCentral() throws SQLException, ClassNotFoundException, ParseException {
        if (verificaPreenchimento()) {
            carregaDadosLacre2();
            adicionar();
            return "CheckListCilLockCentral";
        } else {
            return "NovoCheckListCentral";
        }
    }

    public String coresStatus(final String condicao) {
        if (condicao.equals("BRANCO")) {
            return "Imagens/Branco.png";
        } else if (condicao.equals("CINZA")) {
            return "Imagens/Cinza.png";
        } else if (condicao.equals("PRETO")) {
            return "Imagens/Preto.png";
        }
        return "Imagens/Vermelho.png";
    }

    public boolean verificaPreenchimento() {
        if (this.checkListObj.getIdLacre().equals("")) {
            this.habilitaMensagemPesquisa = true;
            this.mensagemPesquisa = "Por favor escolha um lacre!";
            return false;
        }
        if (this.checkListObj.getCondicao().equals("VERMELHO") && this.checkListObj.getDefeito().equals("")) {
            this.habilitaMensagemPesquisa = true;
            this.mensagemPesquisa = "Por favor selecio o defeito!";
            return false;
        }
        if (this.checkListObj.getTecnico().equals("")) {
            this.habilitaMensagemPesquisa = true;
            this.mensagemPesquisa = "Por favor escolha o técnico!";
            return false;
        }
        return true;
    }

    public List<CheckListModel> getListaCod() throws SQLException, ClassNotFoundException {
        CheckListDao dao = new CheckListDao();
        List<CheckListModel> listaDeCheck = dao.getListaCod(this.checkListObj.getCod());        
        SimpleDateFormat spf = new SimpleDateFormat("dd/MM/yyyy");

        for (CheckListModel check : listaDeCheck) {

            this.checkListObj.setIdLacre(check.getIdLacre());
            this.checkListObj.setModelo(check.getModelo());
            this.checkListObj.setModulo(check.getModulo());
            this.checkListObj.setVinculacao(check.getVinculacao());
            this.checkListObj.setChip1(check.getChip1());
            this.checkListObj.setChip2(check.getChip2());
            this.checkListObj.setDefeito(check.getDefeito());
            this.checkListObj.setConserto(check.getConserto());
            this.checkListObj.setCondicao(check.getCondicao());
            this.checkListObj.setObservacao(check.getObservacao());
            this.checkListObj.setTecnico(check.getTecnico());
            this.checkListObj.setDataCadastro(check.getDataCadastro());            
            this.checkListObj.setDefeito_2(check.getDefeito_2());
            this.checkListObj.setDefeito_3(check.getDefeito_3());
            this.checkListObj.setDefeito_4(check.getDefeito_4());
            this.checkListObj.setTecnico_manutencao(check.getTecnico_manutencao());
            this.checkListObj.setTecnico_retirada(check.getTecnico_retirada());
            this.checkListObj.setCobranca(check.isCobranca());
            
            this.dataCadastro2 = spf.format(check.getDataCadastro());

        }
        return listaDeCheck;
    }

    public boolean pesquisa() throws SQLException, ClassNotFoundException {
        limparCampos();
        limparMensagens();

        if (this.pesquisaCod.equals("Pesquisa")) {
            return false;
        }

        //filtro de caracteres especiais
        if (this.pesquisaCod.replaceAll("\\D*", "").equals("")) {
            this.mensagemPesquisa = "Por favor entre com a pesquisa por códigou ou nÃºmero do controle!";
            this.habilitaMensagemPesquisa = true;
            return false;
        }
        
        //filtro pelo Id do Lacre ou pesquisa todos os check list que daquele ID
        this.checkListObj.setIdLacre(pesquisaCod.replaceAll("\\D*", ""));
        contadorIdLacre = 0;
        getListaIdLacre();
        if (contadorIdLacre > 0) {
            return true;
        }

        //pesquisa por CODIGO do lacre
        limparCampos();
        this.checkListObj.setCod(Integer.parseInt(pesquisaCod.replaceAll("\\D*", "")));
        if (this.checkListObj.getCod() > 0) {
            getListaCod();
            if (!this.checkListObj.getIdLacre().equals("")) {
                limparMensagens();
                return true;
            } else {
                limparMensagens();
                this.mensagemPesquisa = "Check List não encontrado ou inexistente!";
                this.habilitaMensagemPesquisa = true;
                return false;
            }
        }

        limparMensagens();
        this.mensagemPesquisa = "Por favor entre com uma pesquisa válida!";
        this.habilitaMensagemPesquisa = true;
        return false;
    }
    
    
    public String resultadoDaPesquisa() throws SQLException, ClassNotFoundException {
        if (pesquisa()) {
            if (contadorIdLacre > 1) {
                return "PesquisaVariosCheckList";
            } else {
                return "PesquisaCheckList";
            }
        } else {
            return "CheckListCilLock";
        }
    }
    
    public String resultadoDaPesquisaCentral() throws SQLException, ClassNotFoundException {
        if (pesquisa()) {
            if (contadorIdLacre > 1) {
                return "PesquisaVariosCheckList";
            } else {
                return "PesquisaCheckListCentral";
            }
        } else {
            return "CheckListCilLockCentral";
        }
    }
    
    
    public void alterar() throws ParseException {
        SimpleDateFormat spf = new SimpleDateFormat("dd/MM/yyyy");
        this.checkListObj.setDataCadastro(spf.parse(dataCadastro2));
        try {
            if (this.checkListObj.getCondicao().equals("")) {
                this.checkListObj.setCondicao("VERMELHO");
            }
            
            CheckListDao dao = new CheckListDao();
            dao.alterar(this.checkListObj);
            if (this.gravarLacre == true) {
                desativarLacre();
            }
            this.habilitaMensagemCadastro = true;
            this.mensagemCadastro = "Check List alterado com sucesso!";
        } catch (Exception e) {
            this.habilitaMensagemPesquisa = true;
            this.mensagemPesquisa = "Problema para alterar o CheckList" + e;
        }
    }
    
    public String alterarCheckList() throws SQLException, ClassNotFoundException, ParseException {
        if (verificaPreenchimento()) {
            carregaDadosLacre2();
            alterar();
            cancelaAlteracao();
            return "CheckListCilLock";
        } else {
            return "PesquisaCheckList";
        }
    }
    
    public String alterarCheckListCentral() throws SQLException, ClassNotFoundException, ParseException {
        if (verificaPreenchimento()) {
            carregaDadosLacre2();
            alterar();
            cancelaAlteracao();
            return "CheckListCilLockCentral";
        } else {
            return "PesquisaCheckListCentral";
        }
    }
    
    public void habilitaAlteracao() {
        this.habilitaAlterar = true;
    }

    public void cancelaAlteracao() {
        this.habilitaAlterar = false;
    }

    public void cancelaExcluir() {
        this.habilitaExcluir = false;
    }

    public void habilitaExclusao() {
        this.habilitaAlterar = false;
        this.habilitaExcluir = true;
    }
    
    
    int contadorIdLacre = 0;

    public List<CheckListModel> getListaIdLacre() throws SQLException, ClassNotFoundException {
        CheckListDao dao = new CheckListDao();
        List<CheckListModel> listaDeCheck = dao.getListaIdLacre(this.checkListObj.getIdLacre());                   
        contadorIdLacre = listaDeCheck.size();        
        return listaDeCheck;
    }
    
    
    public void excluir() throws SQLException, ClassNotFoundException {        
        CheckListDao dao = new CheckListDao();
        dao.excluir(this.checkListObj);
        this.mensagemCadastro = "Check List excluído com sucesso!";
        this.habilitaMensagemCadastro = true;
        cancelaExcluir();
    }
    
    public String aplicaExcluir() throws SQLException, ClassNotFoundException {
        excluir();
        return "CheckListCilLock";
    }
    
     public String aplicaExcluirCentral() throws SQLException, ClassNotFoundException {
        excluir();
        return "CheckListCilLockCentral";
    }
}
