using System;
using System.Net.Http;
using Newtonsoft.Json;
using fatd_faturamento.Bancos.Sicoob.Entidade;
using fatd_faturamento.ENTIDADE;
using System.Security.Cryptography.X509Certificates;

namespace fatd_faturamento.Bancos.Sicoob
{
    public class BoletoSicoob
    {
        public string IncluirBoletoGrupoA(string token, string clientId, string path, string certificadoSenha, string url, int numeroContrato, int modalidade, int numeroContaCorrente, string especieDocumento, int tipoDesconto, int tipoMulta, int tipoJurosMora, int numeroParcela, entidadeTempFaturaA entidadeTempFaturaA)
        {
            string result = string.Empty;

            try
            {
                X509Certificate2 certificado = new X509Certificate2(path, certificadoSenha);

                using (HttpClient httpClient = new HttpClient(new HttpClientHandler
                {
                    ClientCertificateOptions = ClientCertificateOption.Manual,
                    SslProtocols = System.Security.Authentication.SslProtocols.Tls12,
                    ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true,
                    ClientCertificates = { certificado }
                }))
                {
                    // Cabeçalhos
                    httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
                    httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
                    httpClient.DefaultRequestHeaders.Add("client_id", clientId);

                    var payload = new IncluirBoletos
                    {
                        numeroContrato = numeroContrato,
                        modalidade = modalidade,
                        numeroContaCorrente = numeroContaCorrente,
                        especieDocumento = especieDocumento,
                        dataEmissao = Convert.ToDateTime(DateTime.Now.ToShortDateString()),
                        seuNumero = Convert.ToString(entidadeTempFaturaA.NUMNF),
                        identificacaoEmissaoBoleto = 1,
                        identificacaoDistribuicaoBoleto = 1,
                        valor = Convert.ToDouble(entidadeTempFaturaA.VALORTOT),
                        dataVencimento = Convert.ToDateTime(entidadeTempFaturaA.DATAVENC.ToShortDateString()),
                        tipoDesconto = tipoDesconto,
                        tipoMulta = tipoMulta,
                        tipoJurosMora = tipoJurosMora,
                        numeroParcela = numeroParcela,
                        pagador = new Pagador
                        {
                            numeroCpfCnpj = entidadeTempFaturaA.CGC.Replace(".", "").Replace("-", "").Replace("/", ""),
                            nome = entidadeTempFaturaA.NOMECONS,
                            endereco = entidadeTempFaturaA.END,
                            bairro = entidadeTempFaturaA.BAIRRO,
                            cidade = entidadeTempFaturaA.CIDADE,
                            cep = entidadeTempFaturaA.CEP.Replace("-", ""),
                            uf = entidadeTempFaturaA.UF
                        },
                        gerarPdf = false,
                        codigoCadastrarPIX = 1
                    };

                    var stringPayload = $"[{JsonConvert.SerializeObject(payload)}]";

                    var content = new StringContent(stringPayload, System.Text.Encoding.UTF8, "application/json");

                    var response = httpClient.PostAsync(url, content).Result;

                    string html = response.Content.ReadAsStringAsync().Result;

                    result = html;
                }

            }
            catch (Exception ex)
            {
                string retorno = "1 - Erro ao na API - Incluir boleto!!! " + ex.Message;
                result = retorno;
            }

            return result;

        }

        public string IncluirBoletoGrupoB(string token, string clientId, string path, string certificadoSenha, string url, int numeroContrato, int modalidade, int numeroContaCorrente, string especieDocumento, int tipoDesconto, int tipoMulta, int tipoJurosMora, int numeroParcela, entidadeTempFatura entidadeTempFaturaB)
        {
            string result = string.Empty;

            try
            {

                X509Certificate2 certificado = new X509Certificate2(path, certificadoSenha);

                using (HttpClient httpClient = new HttpClient(new HttpClientHandler
                {
                    ClientCertificateOptions = ClientCertificateOption.Manual,
                    SslProtocols = System.Security.Authentication.SslProtocols.Tls12,
                    ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true,
                    ClientCertificates = { certificado }
                }))
                {
                    // Cabeçalhos
                    httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
                    httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
                    httpClient.DefaultRequestHeaders.Add("client_id", clientId);

                    var payload = new IncluirBoletos
                    {
                        numeroContrato = numeroContrato,
                        modalidade = modalidade,
                        numeroContaCorrente = numeroContaCorrente,
                        especieDocumento = especieDocumento,
                        dataEmissao = Convert.ToDateTime(DateTime.Now.ToShortDateString()),
                        seuNumero = Convert.ToString(entidadeTempFaturaB.NUMNF),
                        identificacaoEmissaoBoleto = 1,
                        identificacaoDistribuicaoBoleto = 1,
                        valor = Convert.ToDouble(entidadeTempFaturaB.VALORTOT),
                        dataVencimento = Convert.ToDateTime(entidadeTempFaturaB.DATAVENC.ToShortDateString()),
                        tipoDesconto = tipoDesconto,
                        tipoMulta = tipoMulta,
                        tipoJurosMora = tipoJurosMora,
                        numeroParcela = numeroParcela,
                        pagador = new Pagador
                        {
                            numeroCpfCnpj = entidadeTempFaturaB.CPF_CNPJ.Replace(".", "").Replace("-", "").Replace("/", ""),
                            nome = entidadeTempFaturaB.NOMECONS,
                            endereco = entidadeTempFaturaB.RUA,
                            bairro = entidadeTempFaturaB.BAIRRO,
                            cidade = entidadeTempFaturaB.CIDADE,
                            cep = entidadeTempFaturaB.CEP.Replace("-", ""),
                            uf = entidadeTempFaturaB.UF
                        },
                        gerarPdf = false,
                        codigoCadastrarPIX = 1
                    };

                    var stringPayload = $"[{JsonConvert.SerializeObject(payload)}]";

                    var content = new StringContent(stringPayload, System.Text.Encoding.UTF8, "application/json");

                    var response = httpClient.PostAsync(url, content).Result;

                    string html = response.Content.ReadAsStringAsync().Result;

                    result = html;
                }

            }
            catch (Exception ex)
            {
                string retorno = "1 - Erro ao na API - Incluir boleto!!! " + ex.Message;
                result = retorno;
            }

            return result;

        }


    }
}
