namespace Download_Faturas
{
    using System.Data.OleDb;
    using System.Globalization;
    using System.Net.Http.Headers;
    using System.Text;
    using System.Text.Json;
    using System.Text.RegularExpressions;

    public class Program
    {
#if DEBUG
        public const string LogFaturas = @"X:\Back\Carteira x.x\4Docs\import.txt";
        public const string LogFaturas2 = @"X:\Back\Carteira x.x\4Docs\import2.txt";
#else
            public const String LogFaturas = "import.txt";
            public const String LogFaturas2 = "import2.txt";
#endif
        public const string CaminhoDB = "X:/Middle/Informativo Setorial/Modelo Word/BD1_dados cadastrais e faturas.accdb";
        private static HttpClient httpClient = new ();
        private static StreamReader sr = new (LogFaturas);
        private static StreamWriter sw = new (LogFaturas2);
        private static string? fatura;

        public static void Main()
        {
            // Abre a conexao com o banco de dados
            using (OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + CaminhoDB + ";Jet OLEDB:Database Password=gds21"))
            {
                conn.Open();

                // Loop entre as faturas pendentes
                while ((fatura = sr.ReadLine()) != null)
                {
                    string fatura_ID = fatura.Split(",")[0];
                    string fatura_status = fatura.Split(",")[1];
                    string fatura_arquivo = fatura.Split(",")[2];

                    if (fatura_ID == "1826871")
                    {
                        int i = 0;
                        i++;
                    }

                    // Verifica se a fatura foi processada e atualiza os valores para banco de dados
                    if (fatura_status == "DELAYED" | fatura_status == "MULTACTIONABLE" | fatura_status == "ACTIONABLE" | fatura_status == string.Empty | fatura_status == "UNIDADE CONSUMIDORA NÃO LOCALIZADA NO BD" | fatura_status == "PREPROCESS")
                    {
                        if (fatura_status == "UNIDADE CONSUMIDORA NÃO LOCALIZADA NO BD" && !File.Exists(fatura_arquivo))
                        {
                            sw.WriteLine(fatura_ID + "," + "ARQUIVO NÃO LOCALIZADO" + "," + fatura_arquivo);
                            Console.WriteLine(fatura_ID + "," + "ARQUIVO NÃO LOCALIZADO" + "," + fatura_arquivo);
                        }
                        else
                        {
                            // Verifica se a fatura foi processada e atualiza os valores para o banco de dados
                            Fatura fatura = new Fatura(fatura_ID, fatura_arquivo, httpClient);

                            if (fatura.Status == "SUCCESS" & !fatura.Agrupada)
                            {
                                fatura.Processar(conn);
                                try
                                {
                                    fatura.Mover(separar: false);
                                    sw.WriteLine(fatura_ID + "," + fatura.Status + "," + fatura.Arquivo);
                                    Console.WriteLine(fatura_ID + "," + fatura.Status + "," + fatura.Arquivo);
                                }
                                catch (FileNotFoundException)
                                {
                                    sw.WriteLine(fatura_ID + "," + "ARQUIVO NÃO LOCALIZADO" + "," + fatura.Arquivo);
                                    Console.WriteLine(fatura_ID + "," + "ARQUIVO NÃO LOCALIZADO" + "," + fatura.Arquivo);
                                }
                            }
                            else if (fatura.Status == "SUCCESS" & fatura.Agrupada)
                            {
                                foreach (JsonElement individual_ID in fatura.Agrupada_children)
                                {
                                    Fatura faturaIndividual = new (individual_ID.ToString(), fatura_arquivo, httpClient);

                                    if (faturaIndividual.Status == "SUCCESS")
                                    {
                                        faturaIndividual.Processar(conn);
                                        try
                                        {
                                            faturaIndividual.Mover(separar: true);
                                            sw.WriteLine(individual_ID.ToString() + "," + faturaIndividual.Status + "," + faturaIndividual.Arquivo);
                                            Console.WriteLine(individual_ID.ToString() + "," + faturaIndividual.Status + "," + faturaIndividual.Arquivo);
                                        }
                                        catch (FileNotFoundException)
                                        {
                                            sw.WriteLine(individual_ID.ToString() + "," + "ARQUIVO NÃO LOCALIZADO" + "," + faturaIndividual.Arquivo);
                                            Console.WriteLine(individual_ID.ToString() + "," + "ARQUIVO NÃO LOCALIZADO" + "," + faturaIndividual.Arquivo);
                                        }
                                    }
                                    else
                                    {
                                        try
                                        {
                                            faturaIndividual.Mover(separar: true);
                                            sw.WriteLine(individual_ID.ToString() + "," + faturaIndividual.Status + "," + faturaIndividual.Arquivo);
                                            Console.WriteLine(individual_ID.ToString() + "," + faturaIndividual.Status + "," + faturaIndividual.Arquivo);
                                        }
                                        catch (FileNotFoundException)
                                        {
                                            sw.WriteLine(individual_ID.ToString() + "," + "ARQUIVO NÃO LOCALIZADO" + "," + faturaIndividual.Arquivo);
                                            Console.WriteLine(individual_ID.ToString() + "," + "ARQUIVO NÃO LOCALIZADO" + "," + faturaIndividual.Arquivo);
                                        }
                                    }
                                }

                                fatura.Arquivo!.Delete();
                            }
                            else if (fatura.Status == "INVALID")
                            {
                                try
                                {
                                    fatura.Mover(separar: false);
                                }
                                catch (FileNotFoundException)
                                {
                                    sw.WriteLine(fatura_ID + "," + "ARQUIVO NÃO LOCALIZADO" + "," + fatura.Arquivo);
                                    Console.WriteLine(fatura_ID + "," + "ARQUIVO NÃO LOCALIZADO" + "," + fatura.Arquivo);
                                }
                            }
                            else
                            {
                                sw.WriteLine(fatura_ID + "," + fatura.Status + "," + fatura_arquivo);
                                Console.WriteLine(fatura_ID + "," + fatura.Status + "," + fatura_arquivo);
                            }
                        }
                    }
                    else
                    {
                        sw.WriteLine(fatura);
                        Console.WriteLine(fatura);
                    }
                }

                sr.Close();
                sw.Close();
                File.Move(LogFaturas2, LogFaturas, true);
            }
        }
    }
}