using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Oracle.ManagedDataAccess.Client;
using EKONO.DB;

namespace EKONO.LN
{
    /// <summary>
    /// Clase que ejecuta las consultas de la clase Queries
    /// </summary>
    public class Logica
    {       
        
        /// <summary>
        /// Ejecuta la consulta de GetValueCGParameter de Queries
        /// </summary>
        /// <param name="pPATAMETER"></param>
        /// <returns></returns>
        public static string GetValueCGParameter(string pPATAMETER)
        {
            return Conexion.EjecutarSelecResultadoUnico(Queries.GetValueCGParameter(pPATAMETER));
        }

        public string Get_ZunifyTranID(string chargeCode) {
            string result = Queries.GetZunifyTranIdByChargeCode(chargeCode);
            return Conexion.EjecutarSelecResultadoUnico(result);
        }

        /// <summary>
        /// Ejecuta el procedimiento almacenado de Almacenamiento en la tabla ZunifyLOG 
        /// </summary>
        /// <param name="REQ_RES"></param>
        public void Add_ZunifyLog(string ID_REGISTRY,string REQ_RES)
        {
            string sp_nombre = "ADD_ZUNIFY_WHLOG";
           

            List<string> nombresParametros = new List<string>();
            nombresParametros.Add("p_N_ID_REGISTER");
            nombresParametros.Add("p_C_MESSAGE");

            List<dynamic> valores = new List<dynamic>();
            valores.Add(ID_REGISTRY);
            valores.Add(REQ_RES);

            List<OracleDbType> tiposValores = new List<OracleDbType>();
            tiposValores.Add(OracleDbType.Int32);
            tiposValores.Add(OracleDbType.Varchar2);

            List<ParameterDirection> direccionParametros = new List<ParameterDirection>();
            direccionParametros.Add(ParameterDirection.Input);
            direccionParametros.Add(ParameterDirection.Input);


            EjecutarProcedimientoAlmacenado(sp_nombre, nombresParametros, valores, tiposValores, direccionParametros,false);

        }

        /// <summary>
        ///  Ejecuta el procedimiento almacenado de Actualización en la tabla ZUNIFY_WHREGISTER
        /// </summary>
        /// <param name="transactionid"></param>
        /// <param name="chargecode"></param>
        /// <param name="amount"></param>
        /// <param name="discount"></param>
        /// <param name="currency"></param>
        /// <param name="terminalcode"></param>
        /// <returns></returns>
        public string Add_ZunifyWHRegister(string transactionid, string chargecode, decimal amount, decimal discount, string currency, string terminalcode)
        {
            string sp_nombre = "ADD_ZUNIFY_WH";


            List<string> nombresParametros = new List<string>();
            nombresParametros.Add("p_C_TRANSACTIONID");
            nombresParametros.Add("p_C_CHARCHECODE");
            nombresParametros.Add("p_N_AMOUNT");
            nombresParametros.Add("p_N_DISCOUNT");
            nombresParametros.Add("p_C_CURRENCY");
            nombresParametros.Add("p_C_TERMINALCODE");

            List<dynamic> valores = new List<dynamic>();
            valores.Add(transactionid);
            valores.Add(chargecode);
            valores.Add(amount);
            valores.Add(discount);
            valores.Add(currency);
            valores.Add(terminalcode);

            List<OracleDbType> tiposValores = new List<OracleDbType>();
            tiposValores.Add(OracleDbType.Varchar2);
            tiposValores.Add(OracleDbType.Varchar2);
            tiposValores.Add(OracleDbType.Decimal);
            tiposValores.Add(OracleDbType.Decimal);
            tiposValores.Add(OracleDbType.Varchar2);
            tiposValores.Add(OracleDbType.Varchar2);

            List<ParameterDirection> direccionParametros = new List<ParameterDirection>();
            direccionParametros.Add(ParameterDirection.Input);
            direccionParametros.Add(ParameterDirection.Input);
            direccionParametros.Add(ParameterDirection.Input);
            direccionParametros.Add(ParameterDirection.Input);
            direccionParametros.Add(ParameterDirection.Input);
            direccionParametros.Add(ParameterDirection.Input);


            return EjecutarProcedimientoAlmacenado(sp_nombre, nombresParametros, valores, tiposValores, direccionParametros, false);
        }



        /// <summary>
        /// Ejeta los Procedimientos almacenados
        /// </summary>
        /// <param name="sp_nombre">Nombre del SP</param>
        /// <param name="nombresParametros">Nombre de los parámetros</param>
        /// <param name="valores">Valor de los parámetros</param>
        /// <param name="tiposValores">Tipo de datos de los parámetros</param>
        /// <param name="direccionParametros">Si son parámetros de entrada o de salida input output</param>
        /// <param name="tieneVariableSalida">Si retorna algun parámetro de salida output</param>
        /// <returns></returns>
        public static string EjecutarProcedimientoAlmacenado(
             string sp_nombre
             , List<string> nombresParametros
             , List<dynamic> valores
             , List<OracleDbType> tiposValores
             , List<ParameterDirection> direccionParametros,bool tieneVariableSalida)
        {
           return Conexion.EjecutarProcedimientoAlmacenado(sp_nombre, nombresParametros
                , valores, tiposValores, direccionParametros, tieneVariableSalida);
        }

        public static long WMS_S_DOCUMENTO()
        {
            return Conexion.WMS_S_DOCUMENTO();
        }
    }
}
