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 HPVS_Tickets_Cabecera_Sincronizacion
    {
        #region Inicial
        public static void Sincronizar_Inicial(DbConnection _obj_DbConnection,
                                                DbTransaction _obj_DbTransaction,
                                               long _lng_idProducto,
                                               long _lng_idEmpresa,
                                               long _lng_idTerminal,
                                               string _str_GUID)
        {
            try
            {
                List<HPVS_Tickets_Cabecera_Modelo> lst_HPVS_Tickets_Cabecera_Modelo = Obtener_TodosRegistros(_obj_DbConnection, _obj_DbTransaction, _lng_idTerminal, _str_GUID);
                List<HPVS_Tickets_Cabecera_Modelo> lst_HPVS_Tickets_Cabecera_Modelo_OTROSTERMINALES = Obtener_TodosRegistro_OtrosTerminales(_obj_DbConnection, _obj_DbTransaction, _lng_idTerminal);

                //Listado Final
                List<HPVS_Tickets_Cabecera_Modelo> lst_HPVS_Tickets_Cabecera_Modelo_FINAL = new List<HPVS_Tickets_Cabecera_Modelo>();
                if (lst_HPVS_Tickets_Cabecera_Modelo != null &&
                    lst_HPVS_Tickets_Cabecera_Modelo.Count > 0)
                {
                    lst_HPVS_Tickets_Cabecera_Modelo_FINAL.AddRange(lst_HPVS_Tickets_Cabecera_Modelo);
                }
                if (lst_HPVS_Tickets_Cabecera_Modelo_OTROSTERMINALES != null &&
                    lst_HPVS_Tickets_Cabecera_Modelo_OTROSTERMINALES.Count > 0)
                {
                    lst_HPVS_Tickets_Cabecera_Modelo_FINAL.AddRange(lst_HPVS_Tickets_Cabecera_Modelo_OTROSTERMINALES);
                }


                if (lst_HPVS_Tickets_Cabecera_Modelo_FINAL != null &&
                    lst_HPVS_Tickets_Cabecera_Modelo_FINAL.Count > 0)
                {
                    foreach (HPVS_Tickets_Cabecera_Modelo mdl_HPVS_Tickets_Cabecera_Modelo in lst_HPVS_Tickets_Cabecera_Modelo_FINAL)
                    {
                        //Formar campo clave
                        string str_CampoClave = mdl_HPVS_Tickets_Cabecera_Modelo.numero.ToString() + "|" +
                                                mdl_HPVS_Tickets_Cabecera_Modelo.idEmpresa.ToString() + "|" +
                                                mdl_HPVS_Tickets_Cabecera_Modelo.idTerminal.ToString() + "|" +
                                                mdl_HPVS_Tickets_Cabecera_Modelo.idSala.ToString() + "|" +
                                                mdl_HPVS_Tickets_Cabecera_Modelo.fechaHora;

                        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,
                                                                                                            HPVS_Tickets_Cabecera_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, mdl_HPVS_Tickets_Cabecera_Modelo.tipoAccion);
                        }
                        //Si no existe lo inserto
                        else 
                        {
                            //Insertar BD
                            SNC_SincronizacionRegistros_Datos.Insertar(_obj_DbConnection,
                                                                        _obj_DbTransaction,
                                                                      _lng_idProducto,
                                                                      _lng_idEmpresa,
                                                                      str_CampoClave,
                                                                      HPVS_Tickets_Cabecera_Modelo.Tabla,
                                                                      _lng_idTerminal,
                                                                      mdl_HPVS_Tickets_Cabecera_Modelo.tipoAccion,
                                                                      Variables_Sincronizacion.g_int_Orden_HPVS_Tickets_Cabecera);
                        }
                        #endregion


                        #region HPV_Terminales
                        string str_CampoClave_Terminales = mdl_HPVS_Tickets_Cabecera_Modelo.idTerminal.ToString();
                        SNC_SincronizacionRegistros_Modelo mdl_SNC_SincronizacionRegistros_Modelo_TERMINALES = SNC_SincronizacionRegistros_Datos.Obtener_Registro(_obj_DbConnection,
                                                                                                                                                                _obj_DbTransaction,
                                                                                                                                                                _lng_idProducto,
                                                                                                                                                                _lng_idEmpresa,
                                                                                                                                                                _lng_idTerminal,
                                                                                                                                                                str_CampoClave_Terminales,
                                                                                                                                                                HPV_Terminales_Modelo.Tabla);

                        //Si no existe insertamos el registro
                        if (mdl_SNC_SincronizacionRegistros_Modelo_TERMINALES == null)
                        {
                            SNC_SincronizacionRegistros_Datos.Insertar(_obj_DbConnection,
                                                                         _obj_DbTransaction,
                                                                        _lng_idProducto,
                                                                        _lng_idEmpresa,
                                                                        str_CampoClave_Terminales,
                                                                        HPV_Terminales_Modelo.Tabla,
                                                                        _lng_idTerminal,
                                                                        Variables_Sincronizacion.G_STR_TIPOACCION_ACTUALIZAR,
                                                                        Variables_Sincronizacion.g_int_Orden_HPV_Terminales);
                        }
                        #endregion
                    }
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(HPVS_Tickets_Cabecera_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_idTerminal,
                                                    string _str_campoClave,
                                                    string _str_TipoAccion,
                                                    long _lng_idTerminal_En_Registro)
        {
            try
            {
                //Poner como actualizada para el propio terminal
                Sincronizar_Actualizar_Final(_obj_DbConnection,
                                                    _obj_DbTransaction,
                                                    _lng_idProducto,
                                                    _lng_idEmpresa,
                                                    _lng_idTerminal,
                                                    _str_campoClave,
                                                    (_str_TipoAccion==Variables_Sincronizacion.G_STR_TIPOACCION_CERRADO ? Variables_Sincronizacion.G_STR_TIPOACCION_CERRADO_SUBIDO : Variables_Sincronizacion.G_STR_TIPOACCION_CONFIRMADO_SUBIDO),
                                                    _lng_idTerminal_En_Registro);


                //El Resto de los terminales
                List<long> lst_idTerminal = HPV_Terminales_Sincronizacion.Obtener_TerminalesAsociados(_obj_DbConnection, _obj_DbTransaction, _lng_idTerminal);

                if (lst_idTerminal != null &&
                    lst_idTerminal.Count > 0)
                {
                    foreach (long lng_idTerminal in lst_idTerminal)
                    {
                        Sincronizar_Actualizar_Final(_obj_DbConnection,
                                                    _obj_DbTransaction,
                                                    _lng_idProducto,
                                                    _lng_idEmpresa,
                                                    lng_idTerminal,
                                                    _str_campoClave,
                                                    _str_TipoAccion,
                                                    _lng_idTerminal_En_Registro);
                    }
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(HPVS_Tickets_Cabecera_Sincronizacion) + "/" + nameof(Sincronizar_Actualizar), true);
            }
        }
        private static void Sincronizar_Actualizar_Final(DbConnection _obj_DbConnection,
                                                        DbTransaction _obj_DbTransaction,
                                                       long _lng_idProducto,
                                                       long _lng_idEmpresa,
                                                       long _lng_idTerminal,
                                                       string _str_CampoClave,
                                                       string _str_TipoAccion,
                                                       long _lng_idTerminal_En_Registro)
        {
            try
            {
                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,
                                                                                                    HPVS_Tickets_Cabecera_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,
                                                                HPVS_Tickets_Cabecera_Modelo.Tabla,
                                                                _lng_idTerminal,
                                                                _str_TipoAccion,
                                                                Variables_Sincronizacion.g_int_Orden_HPVS_Tickets_Cabecera);
                }
                #endregion

                #region HPV_Terminales
                string str_CampoClave_Terminales = _lng_idTerminal_En_Registro.ToString();
                SNC_SincronizacionRegistros_Modelo mdl_SNC_SincronizacionRegistros_Modelo_TERMINALES = SNC_SincronizacionRegistros_Datos.Obtener_Registro(_obj_DbConnection,
                                                                                                                                                        _obj_DbTransaction,
                                                                                                                                                        _lng_idProducto,
                                                                                                                                                        _lng_idEmpresa,
                                                                                                                                                        _lng_idTerminal,
                                                                                                                                                        str_CampoClave_Terminales,
                                                                                                                                                        HPV_Terminales_Modelo.Tabla);

                //Si no existe insertamos el registro
                if (mdl_SNC_SincronizacionRegistros_Modelo_TERMINALES == null)
                {
                    SNC_SincronizacionRegistros_Datos.Insertar(_obj_DbConnection,
                                                                 _obj_DbTransaction,
                                                                _lng_idProducto,
                                                                _lng_idEmpresa,
                                                                str_CampoClave_Terminales,
                                                                HPV_Terminales_Modelo.Tabla,
                                                                _lng_idTerminal,
                                                                Variables_Sincronizacion.G_STR_TIPOACCION_ACTUALIZAR,
                                                                Variables_Sincronizacion.g_int_Orden_HPV_Terminales);
                }
                #endregion



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

        #region Borrar
        public static void Sincronizar_Borrar(DbConnection _obj_DbConnection,
                                                DbTransaction _obj_DbTransaction,
                                                long _lng_idProducto,
                                                long _lng_idEmpresa,
                                                long _lng_idTerminal,
                                                string _str_CampoClave)
        {
            try
            {
                //Borrar definitivamente solo el del terminal principal
                SNC_SincronizacionRegistros_Datos.Borrar(_obj_DbConnection,
                                                            _obj_DbTransaction,
                                                             _lng_idProducto,
                                                             _lng_idTerminal,
                                                             _lng_idEmpresa,
                                                              HPVS_Tickets_Cabecera_Modelo.Tabla,
                                                             _str_CampoClave);

                //El Resto de los terminales
                List<long> lst_idTerminal = HPV_Terminales_Sincronizacion.Obtener_TerminalesAsociados(_obj_DbConnection, _obj_DbTransaction, _lng_idTerminal);

                if (lst_idTerminal != null &&
                    lst_idTerminal.Count > 0)
                {
                    foreach (long lng_idTerminal in lst_idTerminal)
                    {
                        //Si existe lo Desasigno, sino lo creo con el tipoaccion de borrar
                        if (SNC_SincronizacionRegistros_Datos.Obtener_Registro(_obj_DbConnection,
                                                                                _obj_DbTransaction,
                                                                                _lng_idProducto,
                                                                                _lng_idEmpresa,
                                                                                lng_idTerminal,
                                                                                _str_CampoClave,
                                                                                HPVS_Tickets_Cabecera_Modelo.Tabla)!=null)
                        {
                            SNC_SincronizacionRegistros_Datos.Desasignar(_obj_DbConnection,
                                                               _obj_DbTransaction,
                                                                _lng_idProducto,
                                                                lng_idTerminal,
                                                                _lng_idEmpresa,
                                                                 HPVS_Tickets_Cabecera_Modelo.Tabla,
                                                                _str_CampoClave
                                                                );


                        }
                        else
                        {
                            //Insertar BD
                            SNC_SincronizacionRegistros_Datos.Insertar(_obj_DbConnection,
                                                                         _obj_DbTransaction,
                                                                        _lng_idProducto,
                                                                        _lng_idEmpresa,
                                                                        _str_CampoClave,
                                                                        HPVS_Tickets_Cabecera_Modelo.Tabla,
                                                                        lng_idTerminal,
                                                                        Variables_Sincronizacion.G_STR_TIPOACCION_BORRAR,
                                                                        Variables_Sincronizacion.g_int_Orden_HPVS_Tickets_Cabecera);
                        }
                    }
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(HPVS_Tickets_Cabecera_Sincronizacion) + "/" + nameof(Sincronizar_Borrar), true);
            }
        }
        #endregion


        public static List<HPVS_Tickets_Cabecera_Modelo> Obtener_TodosRegistros(DbConnection _obj_DbConnection,
                                                                                DbTransaction _obj_DbTransaction,
                                                                               long _lng_idTerminal,
                                                                               string _str_GUID)
        {
            List<HPVS_Tickets_Cabecera_Modelo> lst_HPVS_Tickets_Cabecera_Modelo = new List<HPVS_Tickets_Cabecera_Modelo>();
            DbDataReader obj_DbDataReader = null;
            try
            {
                string str_SQL = " SELECT " +
                                           nameof(HPVS_Tickets_Cabecera_Modelo.numero) + "," +
                                           nameof(HPVS_Tickets_Cabecera_Modelo.idEmpresa) + "," +
                                           nameof(HPVS_Tickets_Cabecera_Modelo.idTerminal) + "," +
                                           nameof(HPVS_Tickets_Cabecera_Modelo.idSala) + "," +
                                           nameof(HPVS_Tickets_Cabecera_Modelo.fechaHora) + "," +
                                           nameof(HPVS_Tickets_Cabecera_Modelo.tipoAccion) + 
                                       " FROM " + HPVS_Tickets_Cabecera_Modelo.Tabla +
                                       " WHERE " +
                                           nameof(HPVS_Tickets_Cabecera_Modelo.idTerminal) + "=" + _lng_idTerminal + " AND " +
                                           nameof(HPVS_Gastos_Modelo.guid) + " = '" + _str_GUID + "'";
                //....................................................................

                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())
                {
                    HPVS_Tickets_Cabecera_Modelo mdl_HPVS_Tickets_Cabecera_Modelo = new HPVS_Tickets_Cabecera_Modelo();

                    //numero
                    mdl_HPVS_Tickets_Cabecera_Modelo.numero = obj_DbDataReader.GetInt64(0);

                    //idEmpresa
                    mdl_HPVS_Tickets_Cabecera_Modelo.idEmpresa = obj_DbDataReader.GetInt64(1);

                    //idTerminal
                    mdl_HPVS_Tickets_Cabecera_Modelo.idTerminal = obj_DbDataReader.GetInt64(2);

                    //idSala
                    mdl_HPVS_Tickets_Cabecera_Modelo.idSala = obj_DbDataReader.GetInt64(3);

                    //fechaHora
                    mdl_HPVS_Tickets_Cabecera_Modelo.fechaHora = obj_DbDataReader.GetDateTime(4).ToString("yyyyMMddHHmmss");

                    //tipoAccion
                    mdl_HPVS_Tickets_Cabecera_Modelo.tipoAccion = obj_DbDataReader.GetString(5);

                    //Añadir al listado
                    lst_HPVS_Tickets_Cabecera_Modelo.Add(mdl_HPVS_Tickets_Cabecera_Modelo);
                }
                obj_DbDataReader.Close();


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

                throw new Control_Errores("", ex, nameof(HPVS_Tickets_Cabecera_Sincronizacion) + "/" + nameof(Obtener_TodosRegistros), true);
            }

            return lst_HPVS_Tickets_Cabecera_Modelo;
        }

        public static List<HPVS_Tickets_Cabecera_Modelo> Obtener_TodosRegistro_OtrosTerminales(DbConnection _obj_DbConnection,
                                                                                                DbTransaction _obj_DbTransaction,
                                                                                               long _lng_idTerminal)
        {
            List<HPVS_Tickets_Cabecera_Modelo> lst_HPVS_Tickets_Cabecera_Modelo = new List<HPVS_Tickets_Cabecera_Modelo>();
            DbDataReader obj_DbDataReader = null;
            try
            {

                #region Terminales Asociados
                string str_idTerminales= "";
                List<long> lst_idTerminalesAsociados = HPV_Terminales_Sincronizacion.Obtener_TerminalesAsociados(_obj_DbConnection, _obj_DbTransaction, _lng_idTerminal);
                
                if (lst_idTerminalesAsociados!=null &&
                    lst_idTerminalesAsociados.Count>0)
                {
                    foreach (long _lng_idTerminalAsociado in lst_idTerminalesAsociados)
                    {
                        str_idTerminales += (_lng_idTerminalAsociado + ",");
                    }
                }
                #endregion

                if (str_idTerminales.Trim().Length>0)
                {
                    str_idTerminales = str_idTerminales.Substring(0, str_idTerminales.Length - 1);


                    string str_SQL = " SELECT " +
                                               nameof(HPVS_Tickets_Cabecera_Modelo.numero) + "," +
                                               nameof(HPVS_Tickets_Cabecera_Modelo.idEmpresa) + "," +
                                               nameof(HPVS_Tickets_Cabecera_Modelo.idTerminal) + "," +
                                               nameof(HPVS_Tickets_Cabecera_Modelo.idSala) + "," +
                                               nameof(HPVS_Tickets_Cabecera_Modelo.fechaHora) + "," +
                                               nameof(HPVS_Tickets_Cabecera_Modelo.tipoAccion) +
                                           " FROM " + HPVS_Tickets_Cabecera_Modelo.Tabla +

                                           " WHERE " +
                                               nameof(HPVS_Tickets_Cabecera_Modelo.tipoAccion) + "='" + Variables_Sincronizacion.G_STR_TIPOACCION_CERRADO + "' AND " +
                                               nameof(HPVS_Gastos_Modelo.idTerminal) + " in (" + str_idTerminales + ")";
                    //....................................................................

                    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())
                    {
                        HPVS_Tickets_Cabecera_Modelo mdl_HPVS_Tickets_Cabecera_Modelo = new HPVS_Tickets_Cabecera_Modelo();

                        //numero
                        mdl_HPVS_Tickets_Cabecera_Modelo.numero = obj_DbDataReader.GetInt64(0);

                        //idEmpresa
                        mdl_HPVS_Tickets_Cabecera_Modelo.idEmpresa = obj_DbDataReader.GetInt64(1);

                        //idTerminal
                        mdl_HPVS_Tickets_Cabecera_Modelo.idTerminal = obj_DbDataReader.GetInt64(2);

                        //idSala
                        mdl_HPVS_Tickets_Cabecera_Modelo.idSala = obj_DbDataReader.GetInt64(3);

                        //fechaHora
                        mdl_HPVS_Tickets_Cabecera_Modelo.fechaHora = obj_DbDataReader.GetDateTime(4).ToString("yyyyMMddHHmmss");

                        //tipoAccion
                        mdl_HPVS_Tickets_Cabecera_Modelo.tipoAccion = obj_DbDataReader.GetString(5);

                        //Añadir al listado
                        lst_HPVS_Tickets_Cabecera_Modelo.Add(mdl_HPVS_Tickets_Cabecera_Modelo);
                    }
                    obj_DbDataReader.Close();
                }

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

                throw new Control_Errores("", ex, nameof(HPVS_Tickets_Cabecera_Sincronizacion) + "/" + nameof(Obtener_TodosRegistro_OtrosTerminales), true);
            }

            return lst_HPVS_Tickets_Cabecera_Modelo;
        }


        
    }
}
