using Exferia_Sincronizacion._0_Modelos.GEN;
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_Clientes_Sincronizacion
    {
        #region Inicial
        public static void Sincronizar_Inicial(DbConnection _obj_DbConnection,
                                                DbTransaction _obj_DbTransaction,
                                               long _lng_idProducto,
                                               long _lng_idEmpresa,
                                               long _lng_idTerminal)
        {
            try
            {
                List<HPV_Clientes_Modelo> lst_HPV_Clientes_Modelo = Obtener_TodosRegistro(_obj_DbConnection, _obj_DbTransaction, _lng_idEmpresa);

                if (lst_HPV_Clientes_Modelo!=null &&
                    lst_HPV_Clientes_Modelo.Count > 0)
                {
                    string str_TipoAccion = "";
                    foreach (HPV_Clientes_Modelo mdl_HPV_Clientes_Modelo in lst_HPV_Clientes_Modelo)
                    {
                        //Poner tipoAccion
                        if (mdl_HPV_Clientes_Modelo.fechaBorrado != null)
                        {
                            str_TipoAccion = Variables_Sincronizacion.G_STR_TIPOACCION_BORRAR;
                        }
                        else
                        {
                            str_TipoAccion = Variables_Sincronizacion.G_STR_TIPOACCION_ACTUALIZAR;
                        }

                        //Formar campo clave
                        string str_CampoClave = mdl_HPV_Clientes_Modelo.id.ToString();

                        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_Clientes_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, str_TipoAccion);
                        }
                        //Si no existe lo inserto
                        else 
                        {
                            //Insertar BD
                            SNC_SincronizacionRegistros_Datos.Insertar(_obj_DbConnection,
                                                                        _obj_DbTransaction,
                                                                      _lng_idProducto,
                                                                      _lng_idEmpresa,
                                                                      str_CampoClave,
                                                                      HPV_Clientes_Modelo.Tabla,
                                                                      _lng_idTerminal,
                                                                      str_TipoAccion,
                                                                      Variables_Sincronizacion.g_int_Orden_HPV_Clientes);
                        }
                        #endregion

                        #region Datos Relacionados

                            #region GEN_ImpuestosCabecera
                            string str_CampoClave_ImpuestosCabecera = mdl_HPV_Clientes_Modelo.idImpuestoCabecera.ToString();
                            SNC_SincronizacionRegistros_Modelo mdl_SNC_SincronizacionRegistros_Modelo_IMPUESTOSCABECERA = SNC_SincronizacionRegistros_Datos.Obtener_Registro(_obj_DbConnection,
                                                                                                                                                                            _obj_DbTransaction,
                                                                                                                                                                            _lng_idProducto,
                                                                                                                                                                            _lng_idEmpresa,
                                                                                                                                                                            _lng_idTerminal,
                                                                                                                                                                            str_CampoClave_ImpuestosCabecera,
                                                                                                                                                                            GEN_ImpuestosCabecera_Modelo.Tabla);

                            //Si no existe insertamos el registro
                            if (mdl_SNC_SincronizacionRegistros_Modelo_IMPUESTOSCABECERA != null)
                            {
                                SNC_SincronizacionRegistros_Datos.Actualizar(_obj_DbConnection, _obj_DbTransaction, mdl_SNC_SincronizacionRegistros_Modelo_IMPUESTOSCABECERA.id, Variables_Sincronizacion.G_STR_TIPOACCION_ACTUALIZAR);
                            }
                            else
                            {
                                SNC_SincronizacionRegistros_Datos.Insertar(_obj_DbConnection,
                                                                            _obj_DbTransaction,
                                                                            _lng_idProducto,
                                                                            _lng_idEmpresa,
                                                                            str_CampoClave_ImpuestosCabecera,
                                                                            GEN_ImpuestosCabecera_Modelo.Tabla,
                                                                            _lng_idTerminal,
                                                                            Variables_Sincronizacion.G_STR_TIPOACCION_ACTUALIZAR,
                                                                            Variables_Sincronizacion.g_int_Orden_GEN_ImpuestosCabecera);
                            }
                            #endregion


                            #region GEN_ImpuestosLineas
                            GEN_ImpuestosLineas_Sincronizacion.Sincronizar_VariosRegistros_Inicial(_obj_DbConnection,
                                                                                                    _obj_DbTransaction,
                                                                                                    _lng_idProducto,
                                                                                                    _lng_idEmpresa,
                                                                                                    _lng_idTerminal,
                                                                                                    mdl_HPV_Clientes_Modelo.idImpuestoCabecera);
                        #endregion


                        #region GEN_Direcciones
                        GEN_Direcciones_Sincronizacion.Sincronizar_VariosRegistros_Inicial(_obj_DbConnection,
                                                                                            _obj_DbTransaction,
                                                                                           _lng_idProducto,
                                                                                           _lng_idEmpresa,
                                                                                           _lng_idTerminal,
                                                                                           null,
                                                                                           null,
                                                                                           null,
                                                                                           null,
                                                                                           null,
                                                                                           null,
                                                                                           null,
                                                                                           mdl_HPV_Clientes_Modelo.id);

                        #endregion
                        #endregion
                    }
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(HPV_Clientes_Sincronizacion) + "/" + nameof(Sincronizar_Inicial), true);
            }
        }
        #endregion

        #region Actualizar
        public static void Sincronizar_Actualizar(  DbConnection _obj_DbConnection,
                                                    DbTransaction _obj_DbTransaction,
                                                    long _lng_idProducto,
                                                    long _lng_idEmpresa,
                                                    long _lng_idCliente,
                                                    long _lng_idImpuestoCabecera)
        {
            try
            {
                List<long> lst_idTerminal = SNC_SincronizacionRegistros_Datos.Obtener_Terminales_PorProducto(_obj_DbConnection, _obj_DbTransaction, _lng_idProducto, _lng_idEmpresa);

                if (lst_idTerminal != null &&
                    lst_idTerminal.Count > 0)
                {
                    foreach (long lng_idTerminal in lst_idTerminal)
                    {
                        Sincronizar_Actualizar(_obj_DbConnection,
                                                 _obj_DbTransaction,
                                                _lng_idProducto,
                                                _lng_idEmpresa,
                                                lng_idTerminal,
                                                _lng_idCliente,
                                                _lng_idImpuestoCabecera);
                    }
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(HPV_Clientes_Sincronizacion) + "/" + nameof(Sincronizar_Actualizar), true);
            }
        }
        public static void Sincronizar_Actualizar(DbConnection _obj_DbConnection,
                                                DbTransaction _obj_DbTransaction,
                                               long _lng_idProducto,
                                               long _lng_idEmpresa,
                                               long _lng_idTerminal,
                                               long _lng_idCliente,
                                               long _lng_idImpuestoCabecera)
        {
            try
            {

                //Formar campo clave
                string str_CampoClave = _lng_idCliente.ToString();

                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_Clientes_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_Clientes_Modelo.Tabla,
                                                                _lng_idTerminal,
                                                                Variables_Sincronizacion.G_STR_TIPOACCION_ACTUALIZAR,
                                                                Variables_Sincronizacion.g_int_Orden_HPV_Clientes);
                }
                #endregion

                #region Datos Relacionados

                #region GEN_ImpuestosCabecera
                string str_CampoClave_ImpuestosCabecera = _lng_idImpuestoCabecera.ToString();
                SNC_SincronizacionRegistros_Modelo mdl_SNC_SincronizacionRegistros_Modelo_IMPUESTOSCABECERA = SNC_SincronizacionRegistros_Datos.Obtener_Registro(_obj_DbConnection,
                                                                                                                                                             _obj_DbTransaction,
                                                                                                                                                            _lng_idProducto,
                                                                                                                                                            _lng_idEmpresa,
                                                                                                                                                            _lng_idTerminal,
                                                                                                                                                            str_CampoClave_ImpuestosCabecera,
                                                                                                                                                            GEN_ImpuestosCabecera_Modelo.Tabla);

                //Si no existe insertamos el registro
                if (mdl_SNC_SincronizacionRegistros_Modelo_IMPUESTOSCABECERA == null)
                {
                    SNC_SincronizacionRegistros_Datos.Insertar(_obj_DbConnection,
                                                                _obj_DbTransaction,
                                                                _lng_idProducto,
                                                                _lng_idEmpresa,
                                                                str_CampoClave_ImpuestosCabecera,
                                                                GEN_ImpuestosCabecera_Modelo.Tabla,
                                                                _lng_idTerminal,
                                                                Variables_Sincronizacion.G_STR_TIPOACCION_ACTUALIZAR,
                                                                Variables_Sincronizacion.g_int_Orden_GEN_ImpuestosCabecera);


                    #region GEN_ImpuestosLineas
                    GEN_ImpuestosLineas_Sincronizacion.Sincronizar_Actualizar_DesdeRelacion(_obj_DbConnection,
                                                                                            _obj_DbTransaction,
                                                                                            _lng_idProducto,
                                                                                            _lng_idEmpresa,
                                                                                            _lng_idImpuestoCabecera,
                                                                                            _lng_idTerminal);
                    #endregion
                }
                #endregion

                #region HPV_Clientes_AgrupacionesClientesLineas
                HPV_Clientes_AgrupacionesClientesLineas_Sincronizacion.Sincronizar_Actualizar_PorCliente(_obj_DbConnection,
                                                                                                        _obj_DbTransaction,
                                                                                                        _lng_idProducto,
                                                                                                        _lng_idEmpresa,
                                                                                                        _lng_idTerminal,
                                                                                                        _lng_idCliente);


                #endregion
                #endregion


            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(HPV_Clientes_Sincronizacion) + "/" + nameof(Sincronizar_Actualizar), true);
            }
        }
        #endregion

        #region Borrar
        public static void Sincronizar_Borrar(DbConnection _obj_DbConnection,
                                               DbTransaction _obj_DbTransaction,
                                               long _lng_idProducto,
                                               long _lng_idEmpresa,
                                               string _str_CampoClave)
        {
            try
            {
                SNC_SincronizacionRegistros_Datos.Desasignar(_obj_DbConnection,
                                                            _obj_DbTransaction,
                                                             _lng_idProducto,
                                                             long.Parse(_str_CampoClave),
                                                             _lng_idEmpresa,
                                                              HPV_Terminales_Modelo.Tabla,
                                                             _str_CampoClave
                                                             );
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(HPV_Terminales_Sincronizacion) + "/" + nameof(Sincronizar_Borrar), true);
            }
        }

        #endregion

        public static List<HPV_Clientes_Modelo> Obtener_TodosRegistro(DbConnection _obj_DbConnection,
                                                                        DbTransaction _obj_DbTransaction,
                                                                        long _lng_idEmpresa)
        {
            List<HPV_Clientes_Modelo> lst_HPV_Clientes_Modelo = new List<HPV_Clientes_Modelo>();
            DbDataReader obj_DbDataReader = null;
            try
            {
                string str_SQL = " SELECT " +
                                        nameof(HPV_Clientes_Modelo.id) + "," +
                                        nameof(HPV_Clientes_Modelo.idImpuestoCabecera) + ", " +
                                        nameof(HPV_Clientes_Modelo.fechaBorrado) + " " +
                                    " FROM " + HPV_Clientes_Modelo.Tabla +
                                    " WHERE " +
                                        nameof(HPV_Clientes_Modelo.idEmpresa) + "=" + _lng_idEmpresa ;
                //....................................................................

                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_Clientes_Modelo mdl_HPV_Clientes_Modelo = new HPV_Clientes_Modelo();

                    //id
                    mdl_HPV_Clientes_Modelo.id = obj_DbDataReader.GetInt64(0);

                    //idImpuestoCabecera
                    mdl_HPV_Clientes_Modelo.idImpuestoCabecera = obj_DbDataReader.GetInt64(1);

                    //fechaBorrado
                    if (!obj_DbDataReader.IsDBNull(2))
                    {
                        mdl_HPV_Clientes_Modelo.fechaBorrado = obj_DbDataReader.GetDateTime(2);
                    }
                    else
                    {
                        mdl_HPV_Clientes_Modelo.fechaBorrado = null;
                    }

                    //Añadir al listado
                    lst_HPV_Clientes_Modelo.Add(mdl_HPV_Clientes_Modelo);
                }
                obj_DbDataReader.Close();

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

                throw new Control_Errores("", ex, nameof(HPV_Clientes_Sincronizacion) + "/" + nameof(Obtener_TodosRegistro), true);
            }

            return lst_HPV_Clientes_Modelo;
        }

    }
}
