using Exferia_Sincronizacion._0_Modelos.SNC;
using Exferia_Sincronizacion.General;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Exferia_Sincronizacion.Datos.SNC
{
    public class SNC_SincronizacionRegistros_Datos
    {
        #region Obtener
        public static SNC_SincronizacionRegistros_Modelo Obtener_Registro(  DbConnection _obj_DbConnection,
                                                                            DbTransaction _obj_DbTransaction,
                                                                            long _lng_idProducto,
                                                                            long _lng_idEmpresa,
                                                                            long _lng_idTerminal,
                                                                            string _str_CampoClave,
                                                                            string _str_Tabla)
        {
            SNC_SincronizacionRegistros_Modelo mdl_SNC_SincronizacionRegistros_Modelo = null;
            DbDataReader obj_DbDataReader = null;

            try
            {
                DbCommand obj_DbCommand = _obj_DbConnection.CreateCommand();
                if (_obj_DbTransaction != null)
                {
                    obj_DbCommand.Transaction = _obj_DbTransaction;
                }
                obj_DbCommand.CommandText = " SELECT  " +
                                                nameof(SNC_SincronizacionRegistros_Modelo.id) + "," +
                                                nameof(SNC_SincronizacionRegistros_Modelo.idEmpresa) + "," +
                                                nameof(SNC_SincronizacionRegistros_Modelo.idProducto) + "," +
                                                nameof(SNC_SincronizacionRegistros_Modelo.campoclave) + "," +
                                                nameof(SNC_SincronizacionRegistros_Modelo.tabla) + "," +
                                                nameof(SNC_SincronizacionRegistros_Modelo.idTerminal) + "," +
                                                nameof(SNC_SincronizacionRegistros_Modelo.tipoAccion) + "," +
                                                nameof(SNC_SincronizacionRegistros_Modelo.orden) + " " +
                                            " FROM " + SNC_SincronizacionRegistros_Modelo.Tabla +
                                            " WHERE " +
                                                     nameof(SNC_SincronizacionRegistros_Modelo.idProducto) + "=" + _lng_idProducto + " AND " +
                                                     nameof(SNC_SincronizacionRegistros_Modelo.idEmpresa) + "=" + _lng_idEmpresa + " AND " +
                                                     nameof(SNC_SincronizacionRegistros_Modelo.idTerminal) + "=" + _lng_idTerminal + " AND " +
                                                     nameof(SNC_SincronizacionRegistros_Modelo.campoclave) + "='" + _str_CampoClave + "' AND " +
                                                     nameof(SNC_SincronizacionRegistros_Modelo.tabla) + "='" + _str_Tabla + "'";

                obj_DbDataReader = obj_DbCommand.ExecuteReader();
                while (obj_DbDataReader.Read())
                {
                    mdl_SNC_SincronizacionRegistros_Modelo = new SNC_SincronizacionRegistros_Modelo();

                    //id
                    mdl_SNC_SincronizacionRegistros_Modelo.id = obj_DbDataReader.GetInt64(0);
                    //idEmpresa
                    mdl_SNC_SincronizacionRegistros_Modelo.idEmpresa = obj_DbDataReader.GetInt64(1);
                    //idProducto
                    mdl_SNC_SincronizacionRegistros_Modelo.idProducto = obj_DbDataReader.GetInt64(2);
                    //campoclave
                    mdl_SNC_SincronizacionRegistros_Modelo.campoclave = obj_DbDataReader.GetString(3);
                    //tabla
                    mdl_SNC_SincronizacionRegistros_Modelo.tabla = obj_DbDataReader.GetString(4);
                    //idTerminal
                    mdl_SNC_SincronizacionRegistros_Modelo.idTerminal = obj_DbDataReader.GetInt64(5);
                    //tipoAccion
                    mdl_SNC_SincronizacionRegistros_Modelo.tipoAccion = obj_DbDataReader.GetString(6);
                    //orden
                    mdl_SNC_SincronizacionRegistros_Modelo.orden = obj_DbDataReader.GetInt32(7);

                    break;
                }
                obj_DbDataReader.Close();
            }
            catch (Exception ex)
            {
                if (obj_DbDataReader != null &&
                    !obj_DbDataReader.IsClosed)
                {
                    obj_DbDataReader.Close();
                }

                throw new Control_Errores("", ex, nameof(SNC_SincronizacionRegistros_Datos) + "/" + nameof(Obtener_Registro), true);
            }

            return mdl_SNC_SincronizacionRegistros_Modelo;
        }

        public static List<long> Obtener_Terminales_PorProducto(    DbConnection _obj_DbConnection,
                                                                    DbTransaction _obj_DbTransaction,
                                                                    long _lng_idProducto,
                                                                    long _lng_idEmpresa)
        {
            List<long> lst_idTerminal = new List<long>();
            DbDataReader obj_DbDataReader = null;

            try
            {
                // Consulta .........................................................
                DbCommand obj_DbCommand = _obj_DbConnection.CreateCommand();
                if (_obj_DbTransaction != null)
                {
                    obj_DbCommand.Transaction = _obj_DbTransaction;
                }

                obj_DbCommand.CommandText = " SELECT distinct " + nameof(SNC_SincronizacionRegistros_Modelo.idTerminal) +
                                            " FROM " + SNC_SincronizacionRegistros_Modelo.Tabla +
                                            " WHERE " + nameof(SNC_SincronizacionRegistros_Modelo.idProducto) + " = " + _lng_idProducto + " AND " +
                                                         nameof(SNC_SincronizacionRegistros_Modelo.idEmpresa) +  " = " + _lng_idEmpresa;
                //....................................................................

                obj_DbDataReader = obj_DbCommand.ExecuteReader();
                while (obj_DbDataReader.Read())
                {
                    lst_idTerminal.Add(obj_DbDataReader.GetInt64(0));                
                }
                obj_DbDataReader.Close();
            }
            catch (Exception ex)
            {
                if (obj_DbDataReader != null &&
                    !obj_DbDataReader.IsClosed)
                {
                    obj_DbDataReader.Close();
                }

                throw new Control_Errores("", ex, nameof(SNC_SincronizacionRegistros_Datos) + "/" + nameof(Obtener_Terminales_PorProducto), true);
            }

            return lst_idTerminal;
        }

        #endregion

        #region Grabar
        public static void Insertar(DbConnection _obj_DbConnection,
                                    DbTransaction _obj_DbTransaction,
                                    long _lng_idProducto,
                                    long _lng_idEmpresa,
                                    string _str_CampoClave,
                                    string _str_Tabla,
                                    long _lng_idTerminal,
                                    string _str_TipoAccion,
                                    int _int_Orden)
        {
            try
            {
                string str_Grabar =  "INSERT INTO " + SNC_SincronizacionRegistros_Modelo.Tabla +
                                    " ( " +
                                        nameof(SNC_SincronizacionRegistros_Modelo.idEmpresa) + "," +
                                        nameof(SNC_SincronizacionRegistros_Modelo.idProducto) + "," +
                                        nameof(SNC_SincronizacionRegistros_Modelo.campoclave) + "," +
                                        nameof(SNC_SincronizacionRegistros_Modelo.tabla) + "," +
                                        nameof(SNC_SincronizacionRegistros_Modelo.idTerminal) + "," +
                                        nameof(SNC_SincronizacionRegistros_Modelo.tipoAccion) + "," +
                                        nameof(SNC_SincronizacionRegistros_Modelo.orden) + " " +
                                    " ) " +
                                " VALUES " +
                                    " ( " +
                                        _lng_idEmpresa + "," +
                                        _lng_idProducto + "," +
                                        "'" + _str_CampoClave + "'," +
                                        "'" + _str_Tabla + "'," +
                                        _lng_idTerminal + "," +
                                        "'" + _str_TipoAccion + "'," +
                                        _int_Orden + "" +
                                    " ) ";

                DbCommand obj_DbCommand = _obj_DbConnection.CreateCommand();
                if (_obj_DbTransaction != null)
                {
                    obj_DbCommand.Transaction = _obj_DbTransaction;
                }
                obj_DbCommand.CommandText = str_Grabar;
                obj_DbCommand.CommandType = CommandType.Text;

                //Ejecutar
                obj_DbCommand.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(SNC_SincronizacionRegistros_Datos) + "/" + nameof(Insertar), true);
            }
        }
        public static void Actualizar(DbConnection _obj_DbConnection,
                                      DbTransaction _obj_DbTransaction,
                                      long _lng_id,
                                      string _str_TipoAccion)
        {
            try
            {
                string str_Grabar = "UPDATE " + SNC_SincronizacionRegistros_Modelo.Tabla +
                                        " SET " + nameof(SNC_SincronizacionRegistros_Modelo.tipoAccion) + " ='" + _str_TipoAccion + "' " +
                                    " WHERE " + nameof(SNC_SincronizacionRegistros_Modelo.id) + "= " + _lng_id;

                DbCommand obj_DbCommand = _obj_DbConnection.CreateCommand();
                if (_obj_DbTransaction != null)
                {
                    obj_DbCommand.Transaction = _obj_DbTransaction;
                }
                obj_DbCommand.CommandText = str_Grabar;
                obj_DbCommand.CommandType = CommandType.Text;

                //Ejecutar
                obj_DbCommand.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(SNC_SincronizacionRegistros_Datos) + "/" + nameof(Actualizar), true);
            }
        }

        public static void Actualizar_NoContenidos( DbConnection _obj_DbConnection,
                                                    DbTransaction _obj_DbTransaction,
                                                    List<string> _lst_CampoClave,
                                                    string _str_FiltroAuxiliar_CampoClave,
                                                    string _str_Tabla,
                                                    long _lng_idProducto,
                                                    long _lng_idEmpresa,
                                                    string _str_TipoAccion)
        {
            try
            {
                string str_Filtro = "";
                if (_lst_CampoClave != null &&
                    _lst_CampoClave.Count>0)
                {
                    foreach (string str_CampoClave in _lst_CampoClave)
                    {
                        str_Filtro += "'" + str_CampoClave + "',";
                    }

                    str_Filtro = " AND (not " + nameof(SNC_SincronizacionRegistros_Modelo.campoclave) + " in (" + str_Filtro.Substring(0, str_Filtro.Length - 1) + "))";
                }



                string str_Grabar = "UPDATE " + SNC_SincronizacionRegistros_Modelo.Tabla +
                                        " SET " + nameof(SNC_SincronizacionRegistros_Modelo.tipoAccion) + " ='" + _str_TipoAccion + "' " +
                                    " WHERE " + nameof(SNC_SincronizacionRegistros_Modelo.idProducto) + "= " + _lng_idProducto + " AND " +
                                                nameof(SNC_SincronizacionRegistros_Modelo.idEmpresa) + "= " + _lng_idEmpresa + " AND " +
                                                nameof(SNC_SincronizacionRegistros_Modelo.tabla) + "= '" + _str_Tabla + "'  " +
                                                _str_FiltroAuxiliar_CampoClave + 
                                                str_Filtro;

                DbCommand obj_DbCommand = _obj_DbConnection.CreateCommand();
                if (_obj_DbTransaction != null)
                {
                    obj_DbCommand.Transaction = _obj_DbTransaction;
                }
                obj_DbCommand.CommandText = str_Grabar;
                obj_DbCommand.CommandType = CommandType.Text;

                //Ejecutar
                obj_DbCommand.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(SNC_SincronizacionRegistros_Datos) + "/" + nameof(Actualizar_NoContenidos), true);
            }
        }

        public static void Actualizar_Todos(DbConnection _obj_DbConnection,
                                                    DbTransaction _obj_DbTransaction,
                                                    string _str_Tabla,
                                                    long _lng_idProducto,
                                                    long _lng_idEmpresa,
                                                    long _lng_idTerminal,
                                                    string _str_TipoAccion)
        {
            try
            {
             

                string str_Grabar = "UPDATE " + SNC_SincronizacionRegistros_Modelo.Tabla +
                                        " SET " + nameof(SNC_SincronizacionRegistros_Modelo.tipoAccion) + " ='" + _str_TipoAccion + "' " +
                                    " WHERE " + nameof(SNC_SincronizacionRegistros_Modelo.idProducto) + "= " + _lng_idProducto + " AND " +
                                                nameof(SNC_SincronizacionRegistros_Modelo.idEmpresa) + "= " + _lng_idEmpresa + " AND " +
                                                nameof(SNC_SincronizacionRegistros_Modelo.tabla) + "= '" + _str_Tabla + "'  ";

                DbCommand obj_DbCommand = _obj_DbConnection.CreateCommand();
                if (_obj_DbTransaction != null)
                {
                    obj_DbCommand.Transaction = _obj_DbTransaction;
                }
                obj_DbCommand.CommandText = str_Grabar;
                obj_DbCommand.CommandType = CommandType.Text;

                //Ejecutar
                obj_DbCommand.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(SNC_SincronizacionRegistros_Datos) + "/" + nameof(Actualizar_Todos), true);
            }
        }

        public static void Desasignar(DbConnection _obj_DbConnection,
                                      DbTransaction _obj_DbTransaction,
                                      long _lng_idProducto,
                                      long _lng_idTerminal)
        {
            try
            {
                string str_Grabar = "DELETE FROM " + SNC_SincronizacionRegistros_Modelo.Tabla +
                                    " WHERE " + nameof(SNC_SincronizacionRegistros_Modelo.idProducto) + "= " + _lng_idProducto + " and " +
                                                nameof(SNC_SincronizacionRegistros_Modelo.idTerminal) + "= " + _lng_idTerminal;

                DbCommand obj_DbCommand = _obj_DbConnection.CreateCommand();
                if (_obj_DbTransaction != null)
                {
                    obj_DbCommand.Transaction = _obj_DbTransaction;
                }
                obj_DbCommand.CommandText = str_Grabar;
                obj_DbCommand.CommandType = CommandType.Text;

                //Ejecutar
                obj_DbCommand.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(SNC_SincronizacionRegistros_Datos) + "/" + nameof(Actualizar), true);
            }
        }

        public static void Desasignar(DbConnection _obj_DbConnection,
                                      DbTransaction _obj_DbTransaction,
                                      long _lng_idProducto,
                                      long _lng_idTerminal,
                                      long _lng_idEmpresa,
                                      string _str_Tabla,
                                      string _str_CampoClave)
        {
            try
            {
                string str_Grabar = "UPDATE " + SNC_SincronizacionRegistros_Modelo.Tabla +
                                        " SET " + nameof(SNC_SincronizacionRegistros_Modelo.tipoAccion) + " ='" + Variables_Sincronizacion.G_STR_TIPOACCION_BORRAR + "' " +
                                    " WHERE " + nameof(SNC_SincronizacionRegistros_Modelo.idProducto) + "= " + _lng_idProducto + " and " +
                                                nameof(SNC_SincronizacionRegistros_Modelo.idTerminal) + "= " + _lng_idTerminal + " and " +
                                                nameof(SNC_SincronizacionRegistros_Modelo.idEmpresa) + "= " + _lng_idEmpresa + " and " +
                                                nameof(SNC_SincronizacionRegistros_Modelo.tabla) + "= '" + _str_Tabla + "' and " +
                                                nameof(SNC_SincronizacionRegistros_Modelo.campoclave) + "= '" + _str_CampoClave + "'";

                DbCommand obj_DbCommand = _obj_DbConnection.CreateCommand();
                if (_obj_DbTransaction != null)
                {
                    obj_DbCommand.Transaction = _obj_DbTransaction;
                }
                obj_DbCommand.CommandText = str_Grabar;
                obj_DbCommand.CommandType = CommandType.Text;

                //Ejecutar
                obj_DbCommand.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(SNC_SincronizacionRegistros_Datos) + "/" + nameof(Desasignar), true);
            }
        }
        public static void Desasignar(DbConnection _obj_DbConnection,
                                      DbTransaction _obj_DbTransaction,
                                      string _str_Where)
        {
            try
            {
                string str_Grabar = "UPDATE " + SNC_SincronizacionRegistros_Modelo.Tabla +
                                        " SET " + nameof(SNC_SincronizacionRegistros_Modelo.tipoAccion) + " ='" + Variables_Sincronizacion.G_STR_TIPOACCION_BORRAR + "' " +
                                    " WHERE " + _str_Where;

                DbCommand obj_DbCommand = _obj_DbConnection.CreateCommand();
                if (_obj_DbTransaction != null)
                {
                    obj_DbCommand.Transaction = _obj_DbTransaction;
                }
                obj_DbCommand.CommandText = str_Grabar;
                obj_DbCommand.CommandType = CommandType.Text;

                //Ejecutar
                obj_DbCommand.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(SNC_SincronizacionRegistros_Datos) + "/" + nameof(Desasignar), true);
            }
        }

        public static void Borrar(DbConnection _obj_DbConnection,
                                      DbTransaction _obj_DbTransaction,
                                      long _lng_idProducto,
                                      long _lng_idTerminal,
                                      long _lng_idEmpresa,
                                      string _str_Tabla,
                                      string _str_CampoClave)
        {
            try
            {
                string str_Grabar = "DELETE FROM  " + SNC_SincronizacionRegistros_Modelo.Tabla +
                                    " WHERE " + nameof(SNC_SincronizacionRegistros_Modelo.idProducto) + "= " + _lng_idProducto + " and " +
                                                nameof(SNC_SincronizacionRegistros_Modelo.idTerminal) + "= " + _lng_idTerminal + " and " +
                                                nameof(SNC_SincronizacionRegistros_Modelo.idEmpresa) + "= " + _lng_idEmpresa + " and " +
                                                nameof(SNC_SincronizacionRegistros_Modelo.tabla) + "= '" + _str_Tabla + "' and " +
                                                nameof(SNC_SincronizacionRegistros_Modelo.campoclave) + "= '" + _str_CampoClave + "'";

                DbCommand obj_DbCommand = _obj_DbConnection.CreateCommand();
                if (_obj_DbTransaction != null)
                {
                    obj_DbCommand.Transaction = _obj_DbTransaction;
                }
                obj_DbCommand.CommandText = str_Grabar;
                obj_DbCommand.CommandType = CommandType.Text;

                //Ejecutar
                obj_DbCommand.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(SNC_SincronizacionRegistros_Datos) + "/" + nameof(Borrar), true);
            }
        }
        #endregion
    }
}
