using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using MySql.Data.MySqlClient;
using fatd_faturamento.ENTIDADE;
using fatd_faturamento.DAL.Conexao;
namespace fatd_faturamento.DAL.Persistencia
{
    public class dalAgenciaVirtual
    {
        string vFILTER = null;
        string vINNERJOIN = null;
        string vAND = null;
        string vORDERBY = null;

        #region "  Agencia Virtual "

        public void TruncateAgenciaVirtual(string istrMesAno)
        {
            MySqlCommand cmd = null;

            IGerenciadorTransacao objGerenciadorTransacao = null;
            ConexaoBD objconexaoBD = null;

            try
            {
                objconexaoBD = new ConexaoBD();

                objconexaoBD.SetarConexaoBanco(TipoBDConexao.agenciavirtual_BD);

                using (objGerenciadorTransacao = FabricaGerenciadorTransacao.GetGerenciador(TipoBDGerenciador.MySql))
                {

                    vORDERBY = " ";

                    vAND = vAND + " TRUNCATE TABLE dm_rotaitem ;";
                    vAND = vAND + " TRUNCATE TABLE dm_consumidor ;";
                    vAND = vAND + " TRUNCATE TABLE dm_medidor ;";
                    vAND = vAND + " TRUNCATE TABLE dm_medidorcanal ;";


                    vAND = vAND + " UPDATE dm_rota SET Mes = '" + istrMesAno.Substring(0, 2) + "' , Ano = '" + istrMesAno.Substring(3, 4) + "';";
                    cmd = new MySqlCommand(this.QueryExecute);

                    objGerenciadorTransacao.Execute(cmd);

                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (cmd != null)
                    cmd.Dispose();
            }
        }

        public void InsertRotaItem(entidadeDm_RotaItem objDm_RotaItem)
        {
            MySqlCommand cmd = null;
            IGerenciadorTransacao objGerenciadorTransacao = null;
            ConexaoBD objconexaoBD = null;
            DataTable dt = null;

            try
            {
                objconexaoBD = new ConexaoBD();

                objconexaoBD.SetarConexaoBanco(TipoBDConexao.agenciavirtual_BD);

                using (objGerenciadorTransacao = FabricaGerenciadorTransacao.GetGerenciador(TipoBDGerenciador.MySql))
                {
                    vINNERJOIN = "dm_rotaitem"; // TABELA DO INSERT

                    vFILTER = "RotaId = ?ROTA , ";
                    vFILTER = vFILTER + "TipoOcorrenciaId = ?TipoOcorrenciaId , ";
                    vFILTER = vFILTER + "StatusRotaItemId   = ?StatusRotaItemId   , ";
                    vFILTER = vFILTER + "Sincronizado = ?Sincronizado , ";
                    vFILTER = vFILTER + "Atualizacao  = ?Atualizacao  ";

                    cmd = new MySqlCommand(this.QueryInsert);

                    cmd.Parameters.AddWithValue("?ROTA", objDm_RotaItem.RotaId);
                    cmd.Parameters.AddWithValue("?TipoOcorrenciaId", objDm_RotaItem.TipoOcorrenciaId);
                    cmd.Parameters.AddWithValue("?StatusRotaItemId", objDm_RotaItem.StatusRotaItemId);
                    cmd.Parameters.AddWithValue("?Sincronizado", objDm_RotaItem.Sincronizado);
                    cmd.Parameters.AddWithValue("?Atualizacao", DateTime.Now);

                    objGerenciadorTransacao.Execute(cmd);

                    vFILTER = "SELECT LAST_INSERT_ID() AS ID";
                    cmd = new MySqlCommand(vFILTER);
                    dt = objGerenciadorTransacao.GetDataTable(cmd);

                    foreach (DataRow linha in dt.Rows)
                    {
                        objDm_RotaItem.Id = long.Parse(linha["ID"].ToString());

                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (cmd != null)
                    cmd.Dispose();
            }
        }

        public void InsertConsumidor(entidadeDm_Consumidor objDm_Consumidor)
        {
            MySqlCommand cmd = null;
            IGerenciadorTransacao objGerenciadorTransacao = null;
            ConexaoBD objconexaoBD = null;
            DataTable dt = null;

            try
            {
                objconexaoBD = new ConexaoBD();

                objconexaoBD.SetarConexaoBanco(TipoBDConexao.agenciavirtual_BD);

                using (objGerenciadorTransacao = FabricaGerenciadorTransacao.GetGerenciador(TipoBDGerenciador.MySql))
                {
                    vINNERJOIN = "dm_consumidor"; // TABELA DO INSERT

                    vFILTER = "RotaItemId = ?RotaItemId , ";
                    vFILTER = vFILTER + "Consumidor = ?Consumidor , ";
                    vFILTER = vFILTER + "UC   = ?UC   , ";
                    vFILTER = vFILTER + "Nome = ?Nome , ";
                    vFILTER = vFILTER + "Sequencia = ?Sequencia , ";
                    vFILTER = vFILTER + "Zona = ?Zona , ";
                    vFILTER = vFILTER + "Livro = ?Livro , ";
                    vFILTER = vFILTER + "Conta = ?Conta , ";
                    vFILTER = vFILTER + "Grupo = ?Grupo , ";
                    vFILTER = vFILTER + "Situacao = ?Situacao , ";
                    vFILTER = vFILTER + "Classe = ?Classe , ";
                    vFILTER = vFILTER + "SubClasse = ?SubClasse , ";
                    vFILTER = vFILTER + "FotoObrigatoria = ?FotoObrigatoria , ";
                    vFILTER = vFILTER + "EnderecoRua = ?EnderecoRua , ";
                    vFILTER = vFILTER + "EnderecoNumero = ?EnderecoNumero , ";
                    vFILTER = vFILTER + "EnderecoComplemento = ?EnderecoComplemento , ";
                    vFILTER = vFILTER + "EnderecoCEP = ?EnderecoCEP , ";
                    vFILTER = vFILTER + "EnderecoBairro = ?EnderecoBairro , ";
                    vFILTER = vFILTER + "EnderecoCidade = ?EnderecoCidade , ";
                    vFILTER = vFILTER + "EnderecoUF = ?EnderecoUF , ";
                    vFILTER = vFILTER + "MediaConsumoPercentual = ?MediaConsumoPercentual , ";
                    vFILTER = vFILTER + "MediaConsumoMensal = ?MediaConsumoMensal , ";
                    vFILTER = vFILTER + "MediaConsumoMenor = ?MediaConsumoMenor , ";
                    vFILTER = vFILTER + "MediaConsumoMaior = ?MediaConsumoMaior , ";
                    vFILTER = vFILTER + "Numero_Caixa = ?Numero_Caixa , ";
                    vFILTER = vFILTER + "Atualizacao  = ?Atualizacao  ";

                    cmd = new MySqlCommand(this.QueryInsert);

                    cmd.Parameters.AddWithValue("?RotaItemId", objDm_Consumidor.RotaItemId);
                    cmd.Parameters.AddWithValue("?Consumidor", objDm_Consumidor.Consumidor);
                    cmd.Parameters.AddWithValue("?UC", objDm_Consumidor.UC);
                    cmd.Parameters.AddWithValue("?Nome", objDm_Consumidor.Nome);
                    cmd.Parameters.AddWithValue("?Sequencia", objDm_Consumidor.Sequencia);
                    cmd.Parameters.AddWithValue("?Zona", objDm_Consumidor.Zona);
                    cmd.Parameters.AddWithValue("?Livro", objDm_Consumidor.Livro);
                    cmd.Parameters.AddWithValue("?Conta", objDm_Consumidor.Conta);
                    cmd.Parameters.AddWithValue("?Grupo", objDm_Consumidor.Grupo);
                    cmd.Parameters.AddWithValue("?Situacao", objDm_Consumidor.Situacao);
                    cmd.Parameters.AddWithValue("?Classe", objDm_Consumidor.Classe);
                    cmd.Parameters.AddWithValue("?SubClasse", objDm_Consumidor.SubClasse);
                    cmd.Parameters.AddWithValue("?FotoObrigatoria", objDm_Consumidor.FotoObrigatoria);
                    cmd.Parameters.AddWithValue("?EnderecoRua", objDm_Consumidor.EnderecoRua);
                    cmd.Parameters.AddWithValue("?EnderecoNumero", objDm_Consumidor.EnderecoNumero);
                    cmd.Parameters.AddWithValue("?EnderecoComplemento", objDm_Consumidor.EnderecoComplemento);
                    cmd.Parameters.AddWithValue("?EnderecoCEP", objDm_Consumidor.EnderecoCEP);
                    cmd.Parameters.AddWithValue("?EnderecoBairro", objDm_Consumidor.EnderecoBairro);
                    cmd.Parameters.AddWithValue("?EnderecoCidade", objDm_Consumidor.EnderecoCidade);
                    cmd.Parameters.AddWithValue("?EnderecoUF", objDm_Consumidor.EnderecoUF);
                    cmd.Parameters.AddWithValue("?MediaConsumoPercentual", objDm_Consumidor.MediaConsumoPercentual);
                    cmd.Parameters.AddWithValue("?MediaConsumoMensal", objDm_Consumidor.MediaConsumoMensal);
                    cmd.Parameters.AddWithValue("?MediaConsumoMenor", objDm_Consumidor.MediaConsumoMenor);
                    cmd.Parameters.AddWithValue("?MediaConsumoMaior", objDm_Consumidor.MediaConsumoMaior);
                    cmd.Parameters.AddWithValue("?Numero_Caixa", objDm_Consumidor.Numero_Caixa);
                    cmd.Parameters.AddWithValue("?Atualizacao", DateTime.Now);

                    objGerenciadorTransacao.Execute(cmd);

                    vFILTER = "SELECT LAST_INSERT_ID() AS ID";
                    cmd = new MySqlCommand(vFILTER);
                    dt = objGerenciadorTransacao.GetDataTable(cmd);

                    foreach (DataRow linha in dt.Rows)
                    {
                        objDm_Consumidor.ID = long.Parse(linha["ID"].ToString());

                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (cmd != null)
                    cmd.Dispose();
            }
        }

        public void InsertMedidor(entidadeDm_Medidor objDm_Medidor)
        {
            MySqlCommand cmd = null;
            IGerenciadorTransacao objGerenciadorTransacao = null;
            ConexaoBD objconexaoBD = null;
            DataTable dt = null;

            try
            {
                objconexaoBD = new ConexaoBD();

                objconexaoBD.SetarConexaoBanco(TipoBDConexao.agenciavirtual_BD);


                using (objGerenciadorTransacao = FabricaGerenciadorTransacao.GetGerenciador(TipoBDGerenciador.MySql))
                {
                    vINNERJOIN = "dm_medidor"; // TABELA DO INSERT

                    vFILTER = "RotaItemId = ?RotaItemId , ";
                    vFILTER = vFILTER + "Numero = ?Numero , ";
                    vFILTER = vFILTER + "Modelo   = ?Modelo   , ";
                    vFILTER = vFILTER + "Tipo = ?Tipo , ";
                    vFILTER = vFILTER + "Transformador = ?Transformador , ";
                    vFILTER = vFILTER + "TipoPadraoMedicao = ?TipoPadraoMedicao , ";
                    vFILTER = vFILTER + "Fabricante = ?Fabricante , ";
                    vFILTER = vFILTER + "Atualizacao  = ?Atualizacao  ";

                    cmd = new MySqlCommand(this.QueryInsert);

                    cmd.Parameters.AddWithValue("?RotaItemId", objDm_Medidor.RotaItemId);
                    cmd.Parameters.AddWithValue("?Numero", objDm_Medidor.Numero);
                    cmd.Parameters.AddWithValue("?Modelo", objDm_Medidor.Modelo);
                    cmd.Parameters.AddWithValue("?Tipo", objDm_Medidor.Tipo);
                    cmd.Parameters.AddWithValue("?Transformador", objDm_Medidor.Transformador);
                    cmd.Parameters.AddWithValue("?TipoPadraoMedicao", objDm_Medidor.TipoPadraoMedicao);
                    cmd.Parameters.AddWithValue("?Fabricante", objDm_Medidor.Fabricante);
                    cmd.Parameters.AddWithValue("?Atualizacao", DateTime.Now);

                    objGerenciadorTransacao.Execute(cmd);

                    vFILTER = "SELECT LAST_INSERT_ID() AS ID";
                    cmd = new MySqlCommand(vFILTER);
                    dt = objGerenciadorTransacao.GetDataTable(cmd);

                    foreach (DataRow linha in dt.Rows)
                    {
                        objDm_Medidor.Id = long.Parse(linha["ID"].ToString());

                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (cmd != null)
                    cmd.Dispose();
            }
        }

        public void InsertMedidorCanal(entidadeDm_medidorcanal objDm_MedidorCanal)
        {
            MySqlCommand cmd = null;
            IGerenciadorTransacao objGerenciadorTransacao = null;
            ConexaoBD objconexaoBD = null;
            DataTable dt = null;

            try
            {
                objconexaoBD = new ConexaoBD();

                objconexaoBD.SetarConexaoBanco(TipoBDConexao.agenciavirtual_BD);

                using (objGerenciadorTransacao = FabricaGerenciadorTransacao.GetGerenciador(TipoBDGerenciador.MySql))
                {
                    vINNERJOIN = "dm_medidorcanal"; // TABELA DO INSERT

                    vFILTER = "MedidorId = ?MedidorId , ";
                    vFILTER = vFILTER + "Canal = ?Canal , ";
                    vFILTER = vFILTER + "CanalAtivo = ?CanalAtivo , ";
                    vFILTER = vFILTER + "CanalFatorMultiplicacao = ?CanalFatorMultiplicacao , ";
                    vFILTER = vFILTER + "grupo = ?grupo , ";
                    vFILTER = vFILTER + "tarifa_branca = ?tarifa_branca , ";
                    vFILTER = vFILTER + "micro_geracao = ?micro_geracao , ";
                    vFILTER = vFILTER + "irrigacao_aquicultura = ?irrigacao_aquicultura , ";
                    vFILTER = vFILTER + "CanalLeituraAnterior = ?CanalLeituraAnterior , ";
                    vFILTER = vFILTER + "CanalLeituraAtual = ?CanalLeituraAtual , ";
                    vFILTER = vFILTER + "Consumo = ?Consumo , ";
                    vFILTER = vFILTER + "Atualizacao  = ?Atualizacao  ";

                    cmd = new MySqlCommand(this.QueryInsert);

                    cmd.Parameters.AddWithValue("?MedidorId", objDm_MedidorCanal.MedidorId);
                    cmd.Parameters.AddWithValue("?Canal", objDm_MedidorCanal.Canal);
                    cmd.Parameters.AddWithValue("?CanalAtivo", objDm_MedidorCanal.CanalAtivo);
                    cmd.Parameters.AddWithValue("?CanalFatorMultiplicacao", objDm_MedidorCanal.CanalFatorMultiplicacao);
                    cmd.Parameters.AddWithValue("?grupo", objDm_MedidorCanal.grupo);
                    cmd.Parameters.AddWithValue("?tarifa_branca", objDm_MedidorCanal.tarifa_branca);
                    cmd.Parameters.AddWithValue("?micro_geracao", objDm_MedidorCanal.micro_geracao);
                    cmd.Parameters.AddWithValue("?irrigacao_aquicultura", objDm_MedidorCanal.irrigacao_agricultura);
                    cmd.Parameters.AddWithValue("?CanalLeituraAnterior", objDm_MedidorCanal.CanalLeituraAnterior);
                    cmd.Parameters.AddWithValue("?CanalLeituraAtual", objDm_MedidorCanal.CanalLeituraAtual);
                    cmd.Parameters.AddWithValue("?Consumo", objDm_MedidorCanal.Consumo);
                    cmd.Parameters.AddWithValue("?Atualizacao", DateTime.Now);

                    objGerenciadorTransacao.Execute(cmd);

                    vFILTER = "SELECT LAST_INSERT_ID() AS ID";
                    cmd = new MySqlCommand(vFILTER);
                    dt = objGerenciadorTransacao.GetDataTable(cmd);

                    foreach (DataRow linha in dt.Rows)
                    {
                        objDm_MedidorCanal.Id = long.Parse(linha["ID"].ToString());

                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (cmd != null)
                    cmd.Dispose();
            }
        }

        public DataTable SelectFotosRotaId(entidadeAgenciaVirtual objAgenciaVirtual)
        {
            DataTable dt = null;
            MySqlCommand cmd = null;
            IGerenciadorTransacao objGerenciadorTransacao = null;
            ConexaoBD objconexaoBD = null;

            try
            {
                objconexaoBD = new ConexaoBD();

                objconexaoBD.SetarConexaoBanco(TipoBDConexao.agenciavirtual_BD);

                using (objGerenciadorTransacao = FabricaGerenciadorTransacao.GetGerenciador(TipoBDGerenciador.MySql))
                {

                    vFILTER = "";
                    vFILTER = vFILTER + " dm_fotoevidencia.Id, ";
                    vFILTER = vFILTER + " dm_fotoevidencia.RotaItemId, ";
                    vFILTER = vFILTER + " dm_fotoevidencia.Base64, ";
                    vFILTER = vFILTER + " dm_consumidor.UC AS unid_id, ";
                    vFILTER = vFILTER + " dm_consumidor.zona AS zona, ";
                    vFILTER = vFILTER + " dm_consumidor.livro AS livro, ";
                    vFILTER = vFILTER + " dm_consumidor.conta AS conta ";

                    vINNERJOIN = " dm_fotoevidencia ";
                    vINNERJOIN = vINNERJOIN + " LEFT JOIN dm_consumidor ON dm_fotoevidencia.RotaItemId = dm_consumidor.RotaItemId ";

                    vORDERBY = "";

                    if (!String.IsNullOrEmpty(objAgenciaVirtual.RotaItemId.ToString()))
                    {
                        vAND = vAND + " AND dm_fotoevidencia.RotaItemId IN (" + objAgenciaVirtual.RotaItemId + ") ";
                    }

                    cmd = new MySqlCommand(this.QuerySelect);

                    dt = objGerenciadorTransacao.GetDataTable(cmd);
                }

                return dt;
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (cmd != null)
                    cmd.Dispose();
            }
        }

        public DataTable SelectRetornoAPP(entidadeAgenciaVirtual objAgenciaVirtual)
        {
            DataTable dt = null;
            MySqlCommand cmd = null;
            IGerenciadorTransacao objGerenciadorTransacao = null;
            ConexaoBD objconexaoBD = null;

            try
            {
                objconexaoBD = new ConexaoBD();

                objconexaoBD.SetarConexaoBanco(TipoBDConexao.agenciavirtual_BD);

                using (objGerenciadorTransacao = FabricaGerenciadorTransacao.GetGerenciador(TipoBDGerenciador.MySql))
                {

                    vFILTER = vFILTER + "dm_consumidor.RotaItemId , ";
                    vFILTER = vFILTER + "dm_rotaitem.RotaId , ";
                    vFILTER = vFILTER + "dm_medidorcanal.MedidorId , ";
                    vFILTER = vFILTER + "dm_consumidor.Zona , ";
                    vFILTER = vFILTER + "dm_consumidor.Livro , ";
                    vFILTER = vFILTER + "dm_consumidor.Conta , ";
                    vFILTER = vFILTER + "dm_consumidor.Consumidor , ";
                    vFILTER = vFILTER + "dm_consumidor.UC , ";
                    vFILTER = vFILTER + "dm_medidorcanal.CanalLeituraAtual, ";
                    vFILTER = vFILTER + "COALESCE(dm_rotaitem.TipoOcorrenciaId, 0), ";
                    vFILTER = vFILTER + "dm_medidorcanal.Atualizacao ";

                    vINNERJOIN = " dm_rotaitem ";
                    vINNERJOIN += " INNER JOIN dm_consumidor ON dm_rotaitem.Id = dm_consumidor.RotaItemId ";
                    vINNERJOIN += " INNER JOIN dm_medidor ON dm_medidor.RotaItemId = dm_rotaitem.Id ";
                    vINNERJOIN += " INNER JOIN dm_medidorcanal ON dm_medidorcanal.MedidorId = dm_medidor.Id ";

                    vORDERBY = " ";

                    if (!String.IsNullOrEmpty(objAgenciaVirtual.ROTAS))
                    {
                        vAND = vAND + " AND LPAD(LEFT(CAST(dm_rotaitem.RotaId as CHAR),4),4,'0') IN (" + objAgenciaVirtual.ROTAS + ") ";

                    }

                    cmd = new MySqlCommand(this.QuerySelect);

                    dt = objGerenciadorTransacao.GetDataTable(cmd);
                }

                return dt;
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (cmd != null)
                    cmd.Dispose();
            }
        }

        public DataTable SelectRotasProcessadas()
        {
            DataTable dt = null;
            MySqlCommand cmd = null;
            IGerenciadorTransacao objGerenciadorTransacao = null;
            ConexaoBD objconexaoBD = null;

            try
            {
                objconexaoBD = new ConexaoBD();

                objconexaoBD.SetarConexaoBanco(TipoBDConexao.agenciavirtual_BD);

                using (objGerenciadorTransacao = FabricaGerenciadorTransacao.GetGerenciador(TipoBDGerenciador.MySql))
                {

                    vFILTER = vFILTER + "DISTINCT ";
                    vFILTER = vFILTER + "dm_rotaitem.RotaId  ";

                    vINNERJOIN = " dm_rotaitem ";

                    vORDERBY = " ";

                    cmd = new MySqlCommand(this.QuerySelect);

                    dt = objGerenciadorTransacao.GetDataTable(cmd);
                }

                return dt;
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (cmd != null)
                    cmd.Dispose();
            }
        }

        #endregion

        #region " Comandos SQL "

        StringBuilder sb = new StringBuilder();

        protected string QueryInsert
        {
            get
            {
                this.sb.Clear();

                this.sb.AppendLine("INSERT INTO  ");
                this.sb.AppendLine(vINNERJOIN + " SET  ");
                this.sb.AppendLine(vFILTER);

                return sb.ToString();
            }
        }

        protected string QueryUpdate
        {
            get
            {
                this.sb.Clear();

                this.sb.AppendLine("UPDATE  ");
                this.sb.AppendLine(vINNERJOIN + " SET  ");
                this.sb.AppendLine(vFILTER);
                this.sb.AppendLine("WHERE 1 = 1 ");
                this.sb.AppendLine(vAND);

                return sb.ToString();
            }
        }

        protected string QueryDelete
        {
            get
            {
                this.sb.Clear();

                this.sb.AppendLine("DELETE FROM  ");
                this.sb.AppendLine(vINNERJOIN);
                this.sb.AppendLine("WHERE 1 = 1 ");
                this.sb.AppendLine(vAND);
                this.sb.AppendLine(vORDERBY);

                return sb.ToString();
            }
        }

        protected string QuerySelect
        {
            get
            {
                this.sb.Clear();

                this.sb.AppendLine("SELECT ");
                this.sb.AppendLine(vFILTER);
                this.sb.AppendLine("FROM ");
                this.sb.AppendLine(vINNERJOIN);
                this.sb.AppendLine("WHERE 1 = 1  ");
                this.sb.AppendLine(vAND);
                this.sb.AppendLine(vORDERBY);

                return sb.ToString();
            }
        }

        protected string QueryExecute
        {
            get
            {
                this.sb.Clear();

                this.sb.AppendLine(vAND);
                this.sb.AppendLine(vORDERBY);

                return sb.ToString();
            }
        }

        #endregion

    }
}
