using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using System.Diagnostics;
using System.Threading;
using System.Security;

namespace CodeSatFramework
{
    [ComVisible(true)]
    public class ClassCONN
    {
        const string strSATDLL = "SAT.dll";
            
        public void Main(string[] args)
        {
             
        }

        public string requestMensagem { get; set; }
        public bool   rastreiaLog { get; set; }

        private void gravarLog(string p_comando, string p_resposta)
        {
            var dataHora = System.DateTimeOffset.Now.ToString("o").Replace(':', '-').Replace('/', '-');

            string p_saida = dataHora + "|" + p_comando + "|" + p_resposta;

            using (System.IO.StreamWriter file =
            new System.IO.StreamWriter(@"C:\SAT\CodeSatFramework_log.txt", true))
            {
                file.WriteLine(p_saida);
            }
        }


        public string GetConsultarSAT(int p_numero_sessao)
        {
            requestMensagem = "";
            gravarLog(GetCurrentMethod(), "Envio|" + p_numero_sessao.ToString() + "|" + requestMensagem);
            try
            {
                requestMensagem = Marshal.PtrToStringAnsi(ConsultarSAT(p_numero_sessao));
            }
            catch (System.Exception e)
            {
                requestMensagem = "000000|00000|0000|CSF:" + e.Message.ToString();
            }
            gravarLog(GetCurrentMethod(), "Resposta|" + p_numero_sessao.ToString() + "|" + requestMensagem);
            return requestMensagem;
        }

        public string GetConsultarStatusOperacional(int p_numero_sessao, string p_codigo)
        {
            requestMensagem = "";
            gravarLog(GetCurrentMethod(), "Envio|" + p_numero_sessao.ToString() + "|" + requestMensagem);
            try
            {
                requestMensagem = Marshal.PtrToStringAnsi(ConsultarStatusOperacional(p_numero_sessao, p_codigo));
            }
            catch (System.Exception e)
            {
                requestMensagem = "000000|00000|0000|CSF:" + e.Message.ToString();
            }
            gravarLog(GetCurrentMethod(), "Resposta|" + p_numero_sessao.ToString() + "|" + requestMensagem);
            return requestMensagem;
        }


        public string SetEnviarDadosVenda(int p_numero_sessao, string p_codigo, string p_dadosvenda)
        {
            requestMensagem = "";
            gravarLog(GetCurrentMethod(), "Envio|" + p_numero_sessao.ToString() + "|" + requestMensagem);
            try
            {
                requestMensagem = Marshal.PtrToStringAnsi(EnviarDadosVenda(p_numero_sessao, p_codigo, @p_dadosvenda));
            }
            catch (System.Exception e)
            {
                requestMensagem = "000000|00000|0000|CSF:" + e.Message.ToString();
            }
            gravarLog(GetCurrentMethod(), "Resposta|" + p_numero_sessao.ToString() + "|" + requestMensagem);
            return requestMensagem;
        }

        

        public string SetCancelarUltimaVenda(int p_numero_sessao, string p_codigo, string p_chave, string p_dadoscancela)
        {
            requestMensagem = "";
            gravarLog(GetCurrentMethod(), "Envio|" + p_numero_sessao.ToString() + "|" + requestMensagem);
            try
            {
                requestMensagem = Marshal.PtrToStringAnsi(CancelarUltimaVenda(p_numero_sessao, p_codigo, p_chave, p_dadoscancela));
            }
            catch (System.Exception e)
            {
                requestMensagem = "000000|00000|0000|CSF:" + e.Message.ToString();
            }
            gravarLog(GetCurrentMethod(), "Resposta|" + p_numero_sessao.ToString() + "|" + requestMensagem);
            return requestMensagem;
        }

        public string SetExtrairLogs(int p_numero_sessao, string p_codigo)
        {

            requestMensagem = "";
            gravarLog(GetCurrentMethod(), "Envio|" + p_numero_sessao.ToString() + "|" + requestMensagem);
            try
            {
                requestMensagem = Marshal.PtrToStringAnsi(ExtrairLogs(p_numero_sessao, p_codigo));
            }
            catch (System.Exception e)
            {
                requestMensagem = "000000|00000|0000|CSF:" + e.Message.ToString();
            }
            gravarLog(GetCurrentMethod(), "Resposta|" + p_numero_sessao.ToString() + "|" + requestMensagem);
            return requestMensagem;
        }

        public string SetTesteFimAFim(int p_numero_sessao, string p_codigo, string p_dadosvenda)
        {
            requestMensagem = "";
            gravarLog(GetCurrentMethod(), "Envio|" + p_numero_sessao.ToString() + "|" + requestMensagem);
            try
            {
                requestMensagem = Marshal.PtrToStringAnsi(TesteFimAFim(p_numero_sessao, p_codigo, p_dadosvenda));
            }
            catch (System.Exception e)
            {
                requestMensagem = "000000|00000|0000|CSF:" + e.Message.ToString();
            }
            gravarLog(GetCurrentMethod(), "Resposta|" + p_numero_sessao.ToString() + "|" + requestMensagem);
            return requestMensagem;
        }
        
        [MethodImpl(MethodImplOptions.NoInlining)]
        private string GetCurrentMethod()
        {
            StackTrace st = new StackTrace();
            StackFrame sf = st.GetFrame(1);

            return sf.GetMethod().Name.ToString();
        }

        [DllImport("kernel32.dll", EntryPoint = "LoadLibrary")]
        static extern int LoadLibrary(
            [MarshalAs(UnmanagedType.LPStr)] string lpLibFileName);

        [DllImport("kernel32.dll", EntryPoint = "GetProcAddress")]
        static extern IntPtr GetProcAddress(int hModule,
            [MarshalAs(UnmanagedType.LPStr)] string lpProcName);

        [DllImport("kernel32.dll", EntryPoint = "FreeLibrary")]
        static extern bool FreeLibrary(int hModule);

        [DllImport(strSATDLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr ConsultarSAT(int numeroSessao);

        [DllImport(strSATDLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr ConsultarStatusOperacional(int numeroSessao, [MarshalAs(UnmanagedType.LPStr)] string codigoDeAtivacao);

        [DllImport(strSATDLL, CallingConvention = CallingConvention.StdCall)]
        public static extern IntPtr EnviarDadosVenda(int nSessao, [MarshalAs(UnmanagedType.LPStr)] string codigoDeAtivacao,
        [MarshalAs(UnmanagedType.LPStr)] string dadosVenda);

        [DllImport(strSATDLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr CancelarUltimaVenda(int numeroSessao, [MarshalAs(UnmanagedType.LPStr)] string codigoDeAtivacao,
        [MarshalAs(UnmanagedType.LPStr)] string chave, [MarshalAs(UnmanagedType.LPStr)] string dadosCancelamento);

        [DllImport(strSATDLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr ExtrairLogs(int numeroSessao, [MarshalAs(UnmanagedType.LPStr)] string codigoDeAtivacao);

        [DllImport(strSATDLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr TesteFimAFim(int numeroSessao, [MarshalAs(UnmanagedType.LPStr)] string codigoDeAtivacao,
        [MarshalAs(UnmanagedType.LPStr)] string dadosVenda);


        /* 
        //
        [DllImport(strSATDLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr ConfigurarInterfaceDeRede(int numeroSessao, [MarshalAs(UnmanagedType.LPStr)] string codigoDeAtivacao,
[MarshalAs(UnmanagedType.LPStr)] string dadosConfiguracao);

        [DllImport(strSATDLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern string AtivarSAT(int numeroSessao, int subComando, [MarshalAs(UnmanagedType.LPStr)] string codigoDeAtivacao,
        [MarshalAs(UnmanagedType.LPStr)] string CNPJ, int cUF);
        //
        [DllImport(strSATDLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern string ComunicarCertificadoICPBRASIL(int numeroSessao, [MarshalAs(UnmanagedType.LPStr)] string codigoDeAtivacao,
        [MarshalAs(UnmanagedType.LPStr)] string certificado);
              
       //
        [DllImport(strSATDLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern string ConsultarNumeroSessao(int numeroSessao, [MarshalAs(UnmanagedType.LPStr)] string codigoDeAtivacao, int cNumeroDeSessao);
        //
        
        //
        [DllImport(strSATDLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern string AssociarAssinatura(int numeroSessao, [MarshalAs(UnmanagedType.LPStr)] string codigoDeAtivacao,
        [MarshalAs(UnmanagedType.LPStr)] string CNPJvalue, // CNPJvalue = Desenvolvedor + Emitente
        [MarshalAs(UnmanagedType.LPStr)] string assinaturaCNPJs);
        //
        [DllImport(strSATDLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern string AtualizarSoftwareSAT(int numeroSessao, [MarshalAs(UnmanagedType.LPStr)] string codigoDeAtivacao);
        //
        [DllImport(strSATDLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern string BloquearSAT(int numeroSessao, [MarshalAs(UnmanagedType.LPStr)] string codigoDeAtivacao);
        //
        [DllImport(strSATDLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern string DesbloquearSAT(int numeroSessao, [MarshalAs(UnmanagedType.LPStr)] string codigoDeAtivacao);
        //
        [DllImport(strSATDLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern string TrocarCodigoDeAtivacao(int numeroSessao, [MarshalAs(UnmanagedType.LPStr)] string codigoDeAtivacao,
        [MarshalAs(UnmanagedType.LPStr)] string opcao,
        [MarshalAs(UnmanagedType.LPStr)] string novoCodigo,
        [MarshalAs(UnmanagedType.LPStr)] string confNovoCodigo);
        */
    }
}
