package br.com.elotech.dao.impl;

import br.com.elotech.dao.AtivadorDao;
import br.com.elotech.model.AtivacaoParams;
import br.com.elotech.model.Registro;
import br.com.elotech.scripts.Script;
import br.com.elotech.util.Crypto;
import br.com.elotech.util.Util;

import java.sql.ResultSet;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class AtivadorDaoImpl implements AtivadorDao {

    private ResultSet rs;
    private Map<String, Object> param = new HashMap<>();

    @Override
    public Registro verificaRegistro(AtivacaoParams params) throws Exception {
        Registro registro = null;
        param.put("codigo", params.getCodigo());
        rs = Util.resolveResultSet(Script.scriptSelectRegistro(), param);
        if(rs.next()){
            registro = new Registro();
            registro.setNome(rs.getString("reg_nome"));
            registro.setSistemaCodigo(rs.getString("reg_sistema_codigo"));
            registro.setModulo(rs.getString("reg_modulo"));
            registro.setValidade(rs.getDate("reg_validade"));
            registro.setCodigo(rs.getString("reg_codigo"));
            registro.setSenha(rs.getString("reg_senha"));
            registro.setHash(rs.getString("reg_hash"));
        }
        return registro;
    }

    @Override
    public Registro verificaBluemix(AtivacaoParams params) throws Exception {
        return Bluemix.verificar(params);
    }

    @Override
    public void bloquearSistema(AtivacaoParams params) throws Exception {
        rs = Util.resolveResultSet(Script.bloqueioStep3(), param);
        while(rs.next()){
            System.out.println("Bloqueado: " + rs.getString("qtd_bloqueados"));
        }
        throw new Exception("Não é possivel salvar, editar ou deletar registros do sistema!\n\n Contate o suporte técnico.");
    }

    @Override
    public void liberarSistema(AtivacaoParams params) throws Exception {
        Util.insertOrUpdate(Script.bloqueioStep1().concat(Script.bloqueioStep2()), param);

        rs = Util.resolveResultSet(Script.desbloqueio(), param);
        while(rs.next()){
            System.out.println("Desbloqueado: " + rs.getString("qtd_desbloqueados"));
        }
    }

    @Override
    public void gravaRegistroValido(Registro registro) throws Exception {
        param.put("reg_nome", registro.getNome());
        param.put("reg_sistema_codigo", registro.getSistemaCodigo());
        param.put("reg_modulo", registro.getModulo());
        param.put("reg_validade", Util.dateToSqlDate(registro.getValidade()));
        param.put("reg_codigo", registro.getCodigo());
        param.put("reg_senha", registro.getSenha());
        param.put("reg_hash", registro.getHash());

        Util.insertOrUpdate(Script.scriptInsertRegistro(), param);
    }

    @Override
    public boolean verificaValidadeRegistro(Date validade) {
        return Util.adicionaDia(validade).after(Calendar.getInstance().getTime());
    }

    @Override
    public void atualizaRegistro(Registro registro) throws Exception {
        param.put("reg_nome", registro.getNome());
        param.put("reg_modulo", registro.getModulo());
        param.put("reg_validade", Util.dateToSqlDate(registro.getValidade()));
        param.put("reg_codigo", registro.getCodigo());
        param.put("reg_senha", registro.getSenha());
        param.put("reg_hash", Crypto.geraHash(registro));

        param.put("reg_sistema_codigo", registro.getSistemaCodigo());

        Util.insertOrUpdate(Script.scriptUpdateRegistro(), param);
    }
}
