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

namespace Exferia_Sincronizacion.Datos.HPV
{
    public class HPV_PLV_AgrupacionesPLVLineas_Sincronizacion
    {
        #region Inicial
        public static void Sincronizar_Inicial(DbConnection _obj_DbConnection,
                                                DbTransaction _obj_DbTransaction,
                                               long _lng_idProducto,
                                               long _lng_idEmpresa,
                                               long _lng_idTerminal,
                                               long _lng_idAgrupacionPLVLinea)
        {
            DbDataReader obj_DbDataReader = null;

            try
            {
                #region CREAR LISTADO
                List<HPV_PLV_AgrupacionesPLVLineas_Modelo> lst_HPV_PLV_AgrupacionesPLVLineas_Modelo = new List<HPV_PLV_AgrupacionesPLVLineas_Modelo>();

                string str_SQL = " SELECT " +
                                        nameof(HPV_PLV_AgrupacionesPLVLineas_Modelo.idPLV) + "," +
                                        nameof(HPV_PLV_AgrupacionesPLVLineas_Modelo.idAgrupacionPLVLinea) + "," +
                                        nameof(HPV_PLV_AgrupacionesPLVLineas_Modelo.observaciones) + " " +
                                    " FROM " + HPV_PLV_AgrupacionesPLVLineas_Modelo.Tabla +
                                    " WHERE " +
                                        nameof(HPV_PLV_AgrupacionesPLVLineas_Modelo.idAgrupacionPLVLinea) + "=" + _lng_idAgrupacionPLVLinea;
                //....................................................................

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

                obj_DbDataReader = obj_DbCommand.ExecuteReader();
                while (obj_DbDataReader.Read())
                {
                    HPV_PLV_AgrupacionesPLVLineas_Modelo mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo = new HPV_PLV_AgrupacionesPLVLineas_Modelo();

                    //idPLV
                    mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo.idPLV = obj_DbDataReader.GetInt64(0);
                    //idAgrupacionPLVLinea
                    mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo.idAgrupacionPLVLinea = obj_DbDataReader.GetInt64(1);

                    //observaciones
                    if (!obj_DbDataReader.IsDBNull(2))
                    {
                        mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo.observaciones = obj_DbDataReader.GetString(2);
                    }
                    else
                    {
                        mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo.observaciones = "";
                    }


                    //Añadir al listado
                    lst_HPV_PLV_AgrupacionesPLVLineas_Modelo.Add(mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo);
                }
                obj_DbDataReader.Close();
                #endregion

                if (lst_HPV_PLV_AgrupacionesPLVLineas_Modelo.Count() > 0)
                {
                    foreach (HPV_PLV_AgrupacionesPLVLineas_Modelo mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo in lst_HPV_PLV_AgrupacionesPLVLineas_Modelo)
                    {
                        //Formar campo clave
                        string str_CampoClave = mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo.idAgrupacionPLVLinea + "|" + mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo.idPLV;

                        SNC_SincronizacionRegistros_Modelo mdl_SNC_SincronizacionRegistros_Modelo = null;
                        #region Obtener el registro sincronizado si hubiera alguno
                        mdl_SNC_SincronizacionRegistros_Modelo = SNC_SincronizacionRegistros_Datos.Obtener_Registro(_obj_DbConnection,
                                                                                                                    _obj_DbTransaction,
                                                                                                                    _lng_idProducto,
                                                                                                                    _lng_idEmpresa,
                                                                                                                    _lng_idTerminal,
                                                                                                                    str_CampoClave,
                                                                                                                    HPV_PLV_AgrupacionesPLVLineas_Modelo.Tabla);
                        #endregion

                        #region Actualizar registro en BD
                        if (mdl_SNC_SincronizacionRegistros_Modelo != null)
                        {
                            SNC_SincronizacionRegistros_Datos.Actualizar(_obj_DbConnection, _obj_DbTransaction, mdl_SNC_SincronizacionRegistros_Modelo.id, Variables_Sincronizacion.G_STR_TIPOACCION_ACTUALIZAR);
                        }
                        //Si no existe lo inserto
                        else 
                        {
                            //Insertar BD
                            SNC_SincronizacionRegistros_Datos.Insertar(_obj_DbConnection,
                                                                     _obj_DbTransaction,
                                                                      _lng_idProducto,
                                                                      _lng_idEmpresa,
                                                                      str_CampoClave,
                                                                      HPV_PLV_AgrupacionesPLVLineas_Modelo.Tabla,
                                                                      _lng_idTerminal,
                                                                      Variables_Sincronizacion.G_STR_TIPOACCION_ACTUALIZAR,
                                                                      Variables_Sincronizacion.g_int_Orden_HPV_PLV_AgrupacionesPLVLineas);
                        }
                        #endregion


                        #region HPV_PLV
                        HPV_PLV_Sincronizacion.Sincronizar_Inicial(_obj_DbConnection,
                                                                    _obj_DbTransaction,
                                                                    _lng_idProducto,
                                                                    _lng_idEmpresa,
                                                                    _lng_idTerminal,
                                                                    mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo.idPLV);
                        #endregion

                    }
                }
            }
            catch (Control_Errores)
            {
                if (obj_DbDataReader != null &&
                    !obj_DbDataReader.IsClosed)
                {
                    obj_DbDataReader.Close();
                }

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

                throw new Control_Errores("", ex, nameof(HPV_PLV_AgrupacionesPLVLineas_Sincronizacion) + "/" + nameof(Sincronizar_Inicial), true);
            }
        }
        #endregion

        #region Actualizar
        public static void Sincronizar_Actualizar_PorAgrupacion(DbConnection _obj_DbConnection,
                                                                DbTransaction _obj_DbTransaction,
                                                               long _lng_idProducto,
                                                               long _lng_idEmpresa,
                                                               long _lng_idTerminal,
                                                               long _lng_idAgrupacionPLVLinea)
        {
            DbDataReader obj_DbDataReader = null;

            try
            {
                #region CREAR LISTADO
                List<HPV_PLV_AgrupacionesPLVLineas_Modelo> lst_HPV_PLV_AgrupacionesPLVLineas_Modelo = new List<HPV_PLV_AgrupacionesPLVLineas_Modelo>();

                string str_SQL = " SELECT " +
                                        nameof(HPV_PLV_AgrupacionesPLVLineas_Modelo.idPLV) + "," +
                                        nameof(HPV_PLV_AgrupacionesPLVLineas_Modelo.idAgrupacionPLVLinea) + "," +
                                        nameof(HPV_PLV_AgrupacionesPLVLineas_Modelo.observaciones) + " " +
                                    " FROM " + HPV_PLV_AgrupacionesPLVLineas_Modelo.Tabla +
                                    " WHERE " +
                                        nameof(HPV_PLV_AgrupacionesPLVLineas_Modelo.idAgrupacionPLVLinea) + "=" + _lng_idAgrupacionPLVLinea;
                //....................................................................

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

                obj_DbDataReader = obj_DbCommand.ExecuteReader();
                while (obj_DbDataReader.Read())
                {
                    HPV_PLV_AgrupacionesPLVLineas_Modelo mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo = new HPV_PLV_AgrupacionesPLVLineas_Modelo();

                    //idPLV
                    mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo.idPLV = obj_DbDataReader.GetInt64(0);
                    //idAgrupacionPLVLinea
                    mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo.idAgrupacionPLVLinea = obj_DbDataReader.GetInt64(1);

                    //observaciones
                    if (!obj_DbDataReader.IsDBNull(2))
                    {
                        mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo.observaciones = obj_DbDataReader.GetString(2);
                    }
                    else
                    {
                        mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo.observaciones = "";
                    }


                    //Añadir al listado
                    lst_HPV_PLV_AgrupacionesPLVLineas_Modelo.Add(mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo);
                }
                obj_DbDataReader.Close();
                #endregion

                List<string> lst_CampoClave = new List<string>();
                #region Buscar los registros segun la linea

                if (lst_HPV_PLV_AgrupacionesPLVLineas_Modelo.Count() > 0)
                {
                    foreach (HPV_PLV_AgrupacionesPLVLineas_Modelo mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo in lst_HPV_PLV_AgrupacionesPLVLineas_Modelo)
                    {
                        //Formar campo clave
                        string str_CampoClave = mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo.idAgrupacionPLVLinea + "|" + mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo.idPLV;
                        //Agregar camop clave
                        lst_CampoClave.Add(str_CampoClave);

                        SNC_SincronizacionRegistros_Modelo mdl_SNC_SincronizacionRegistros_Modelo = null;
                        #region Obtener el registro sincronizado si hubiera alguno
                        mdl_SNC_SincronizacionRegistros_Modelo = SNC_SincronizacionRegistros_Datos.Obtener_Registro(_obj_DbConnection,
                                                                                                                    _obj_DbTransaction,
                                                                                                                    _lng_idProducto,
                                                                                                                    _lng_idEmpresa,
                                                                                                                    _lng_idTerminal,
                                                                                                                    str_CampoClave,
                                                                                                                    HPV_PLV_AgrupacionesPLVLineas_Modelo.Tabla);
                        #endregion

                        #region Actualizar registro en BD
                        if (mdl_SNC_SincronizacionRegistros_Modelo == null)
                        {
                            //Insertar BD
                            SNC_SincronizacionRegistros_Datos.Insertar(_obj_DbConnection,
                                                                        _obj_DbTransaction,
                                                                      _lng_idProducto,
                                                                      _lng_idEmpresa,
                                                                      str_CampoClave,
                                                                      HPV_PLV_AgrupacionesPLVLineas_Modelo.Tabla,
                                                                      _lng_idTerminal,
                                                                      Variables_Sincronizacion.G_STR_TIPOACCION_ACTUALIZAR,
                                                                      Variables_Sincronizacion.g_int_Orden_HPV_PLV_AgrupacionesPLVLineas);

                            #endregion


                            #region HPV_PLV
                            HPV_PLV_Sincronizacion.Sincronizar_Actualizar(_obj_DbConnection,
                                                                        _obj_DbTransaction,
                                                                        _lng_idProducto,
                                                                        _lng_idEmpresa,
                                                                        _lng_idTerminal,
                                                                        mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo.idPLV,
                                                                        true,
                                                                        true);
                            #endregion
                        }


                    }
                }
                #endregion


                #region Desasignar todos los registros que no esten en el listado relleno
                //Se utiliza par que no borrer registros que tengan otra relacion 
                string str_FiltroAuxiliar = " AND " + nameof(SNC_SincronizacionRegistros_Modelo.campoclave) + " LIKE '" + (_lng_idAgrupacionPLVLinea + "|%") + "' ";

                SNC_SincronizacionRegistros_Datos.Actualizar_NoContenidos(_obj_DbConnection, _obj_DbTransaction, lst_CampoClave, str_FiltroAuxiliar, HPV_PLV_AgrupacionesPLVLineas_Modelo.Tabla, _lng_idProducto, _lng_idEmpresa, Variables_Sincronizacion.G_STR_TIPOACCION_BORRAR);

                #endregion
            }
            catch (Control_Errores)
            {
                if (obj_DbDataReader != null &&
                   !obj_DbDataReader.IsClosed)
                {
                    obj_DbDataReader.Close();
                }

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

                throw new Control_Errores("", ex, nameof(HPV_PLV_AgrupacionesPLVLineas_Sincronizacion) + "/" + nameof(Sincronizar_Actualizar_PorAgrupacion), true);
            }
        }
        public static void Sincronizar_Actualizar_PorPLV(DbConnection _obj_DbConnection,
                                                DbTransaction _obj_DbTransaction,
                                               long _lng_idProducto,
                                               long _lng_idEmpresa,
                                               long _lng_idTerminal,
                                               long _lng_idPLV)
        {
            DbDataReader obj_DbDataReader = null;

            try
            {
                #region CREAR LISTADO
                List<HPV_PLV_AgrupacionesPLVLineas_Modelo> lst_HPV_PLV_AgrupacionesPLVLineas_Modelo = new List<HPV_PLV_AgrupacionesPLVLineas_Modelo>();

                string str_SQL = " SELECT " +
                                        nameof(HPV_PLV_AgrupacionesPLVLineas_Modelo.idPLV) + "," +
                                        nameof(HPV_PLV_AgrupacionesPLVLineas_Modelo.idAgrupacionPLVLinea) + "," +
                                        nameof(HPV_PLV_AgrupacionesPLVLineas_Modelo.observaciones) + " " +
                                    " FROM " + HPV_PLV_AgrupacionesPLVLineas_Modelo.Tabla +
                                    " WHERE " +
                                        nameof(HPV_PLV_AgrupacionesPLVLineas_Modelo.idPLV) + "=" + _lng_idPLV;
                //....................................................................

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

                obj_DbDataReader = obj_DbCommand.ExecuteReader();
                while (obj_DbDataReader.Read())
                {
                    HPV_PLV_AgrupacionesPLVLineas_Modelo mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo = new HPV_PLV_AgrupacionesPLVLineas_Modelo();

                    //idPLV
                    mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo.idPLV = obj_DbDataReader.GetInt64(0);
                    //idAgrupacionPLVLinea
                    mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo.idAgrupacionPLVLinea = obj_DbDataReader.GetInt64(1);

                    //observaciones
                    if (!obj_DbDataReader.IsDBNull(2))
                    {
                        mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo.observaciones = obj_DbDataReader.GetString(2);
                    }
                    else
                    {
                        mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo.observaciones = "";
                    }


                    //Añadir al listado
                    lst_HPV_PLV_AgrupacionesPLVLineas_Modelo.Add(mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo);
                }
                obj_DbDataReader.Close();
                #endregion

                List<string> lst_CampoClave = new List<string>();
                #region Buscar los registros segun la linea

                if (lst_HPV_PLV_AgrupacionesPLVLineas_Modelo.Count() > 0)
                {
                    foreach (HPV_PLV_AgrupacionesPLVLineas_Modelo mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo in lst_HPV_PLV_AgrupacionesPLVLineas_Modelo)
                    {
                        //Formar campo clave
                        string str_CampoClave = mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo.idAgrupacionPLVLinea + "|" + mdl_HPV_PLV_AgrupacionesPLVLineas_Modelo.idPLV;
                        //Agregar camop clave
                        lst_CampoClave.Add(str_CampoClave);

                        SNC_SincronizacionRegistros_Modelo mdl_SNC_SincronizacionRegistros_Modelo = null;
                        #region Obtener el registro sincronizado si hubiera alguno
                        mdl_SNC_SincronizacionRegistros_Modelo = SNC_SincronizacionRegistros_Datos.Obtener_Registro(_obj_DbConnection,
                                                                                                                    _obj_DbTransaction,
                                                                                                                    _lng_idProducto,
                                                                                                                    _lng_idEmpresa,
                                                                                                                    _lng_idTerminal,
                                                                                                                    str_CampoClave,
                                                                                                                    HPV_PLV_AgrupacionesPLVLineas_Modelo.Tabla);
                        #endregion

                        #region Actualizar registro en BD
                        if (mdl_SNC_SincronizacionRegistros_Modelo == null)
                        {
                            //Insertar BD
                            SNC_SincronizacionRegistros_Datos.Insertar(_obj_DbConnection,
                                                                        _obj_DbTransaction,
                                                                      _lng_idProducto,
                                                                      _lng_idEmpresa,
                                                                      str_CampoClave,
                                                                      HPV_PLV_AgrupacionesPLVLineas_Modelo.Tabla,
                                                                      _lng_idTerminal,
                                                                      Variables_Sincronizacion.G_STR_TIPOACCION_ACTUALIZAR,
                                                                      Variables_Sincronizacion.g_int_Orden_HPV_PLV_AgrupacionesPLVLineas);
                        }
                        else 
                        {
                            //Actualizar BD
                            SNC_SincronizacionRegistros_Datos.Actualizar(_obj_DbConnection,
                                                                    _obj_DbTransaction,
                                                                      mdl_SNC_SincronizacionRegistros_Modelo.id,
                                                                      Variables_Sincronizacion.G_STR_TIPOACCION_ACTUALIZAR);
                        }
                        #endregion
                    }
                }
                #endregion


                #region Desasignar todos los registros que no esten en el listado relleno
                //Se utiliza par que no borrer registros que tengan otra relacion 
                string str_FiltroAuxiliar = " AND " + nameof(SNC_SincronizacionRegistros_Modelo.campoclave) + " LIKE '" + ("%|" + _lng_idPLV) + "' ";

                SNC_SincronizacionRegistros_Datos.Actualizar_NoContenidos(_obj_DbConnection, _obj_DbTransaction, lst_CampoClave, str_FiltroAuxiliar, HPV_PLV_AgrupacionesPLVLineas_Modelo.Tabla, _lng_idProducto, _lng_idEmpresa, Variables_Sincronizacion.G_STR_TIPOACCION_BORRAR);

                #endregion
            }
            catch (Control_Errores)
            {
                if (obj_DbDataReader != null &&
                   !obj_DbDataReader.IsClosed)
                {
                    obj_DbDataReader.Close();
                }

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

                throw new Control_Errores("", ex, nameof(HPV_PLV_AgrupacionesPLVLineas_Sincronizacion) + "/" + nameof(Sincronizar_Actualizar_PorPLV), true);
            }
        }
        #endregion
    }
}
