using Hochbaustatistik.Business;
using Hochbaustatistik.Utilities;
using NLog;
using OpenQA.Selenium.DevTools.V110.WebAuthn;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;

namespace Hochbaustatistik.Database
{
    public static class DatabaseOperations
    {
        private static readonly Logger _logger = NLog.LogManager.GetCurrentClassLogger();

        public static string conString;
        public static string csvPath;

        [ExcludeFromCodeCoverage]
        private static string GenerateQueryHochbau(string az, int identifikator = 0)
        {
            string sqlQuery = "SELECT "
                                + "INPROP.PMGTVVORGANG.VORGANGID, "
                                + "INPROP.PMGTVVORGANG.VORGANGDEFID, "
                                + "INPROP.PMGTVVORGANG.STRASSE1ID, "
                                + "INPROP.PMGTVVORGANG.STRASSE1, "
                                + "INPROP.PMGTVVORGANG.HAUSNUMMER1, "
                                + "INPROP.PMGTVSACHBEARB.NAME, "
                                + "INPROP.PMGTVVORGANG.VORGANGABGESCHL, "   //zdA
                                + "INPROP.PMGTVVORGANG.DATUMEINGANG, "
                                + "INPROP.PMGTVVORGANGVAR.FLD_D_3, "        //Genehmigung
                                + "INPROP.PMGTVVORGANGVAR.FLD_D_5, "        //Freigabe
                                + "INPROP.PMGTVVORGANG.FLD_B_2, "           //Statistik relevant
                                + "INPROP.PMGTVVORGANG.FLD_A_2, "           //Statistik1 
                                + "INPROP.PMGTVVORGANG.FLD_A_3, "           //Statistik2 
                                + "INPROP.PMGTVVORGANGVAR.FLD_D_10, "       //Genehmigung gemeldet
                                + "INPROP.PMGTVVORGANGVAR.FLD_D_11, "       //Fertigstellung gemeldet
                                + "INPROP.PMGTVVORGANGVAR.FLD_D_15, "       //Baubeginn 
                                + "INPROP.PMGTVVORGANGVAR.FLD_D_16, "       //Teilrohbauabnahme 
                                + "INPROP.PMGTVVORGANGVAR.FLD_D_17, "       //Rohbauabnahme 
                                + "INPROP.PMGTVVORGANGVAR.FLD_D_20, "       //Schlussabnahme
                                + "INPROP.PMGTVVORGANG.FLD_A_20, "          //Vorjahr
                                + "INPROP.PMGTVVORGANGVAR.FLD_C_2, "        //Bauüberhang Vorjahr
                                + "INPROP.PMGTVVORGANG.AKTENSTANDORT, "
                                + "INPROP.PMGTVVORGANGVAR.FLD_D_12 "        //Baugenehmigung ausgeführt
                                + "FROM INPROP.PMGTVVORGANG "
                                + "INNER JOIN INPROP.PMGTVVORGANGVAR ON INPROP.PMGTVVORGANG.VORGANGID = INPROP.PMGTVVORGANGVAR.VORGANGID "
                                + "AND INPROP.PMGTVVORGANG.VORGANGID = INPROP.PMGTVVORGANGVAR.VORGANGID "
                                + "INNER JOIN INPROP.PMVBCHECKLIST ON INPROP.PMGTVVORGANG.CHECKID = INPROP.PMVBCHECKLIST.CHECKLISTID "
                                + "INNER JOIN INPROP.PMGTVSACHBEARB ON INPROP.PMGTVVORGANG.ANWENDER = INPROP.PMGTVSACHBEARB.USERID ";
            if (identifikator > 0)
            {
                sqlQuery += "WHERE INPROP.PMGTVVORGANG.FLD_A_2 LIKE '%" + identifikator.ToString() + "%' OR INPROP.PMGTVVORGANG.FLD_A_3 LIKE '%" + identifikator.ToString() + "%'";
            }
            else
            {
                sqlQuery += "WHERE INPROP.PMGTVVORGANG.VORGANGID='" + az + "'";
            }

            return sqlQuery;
        }

        [ExcludeFromCodeCoverage]
        private static VorgangInpro FillVorgangInproHochbau(Oracle.ManagedDataAccess.Client.OracleConnection con, Oracle.ManagedDataAccess.Client.OracleCommand cmd, Vorgang v)
        {
            con.Open();
            using (Oracle.ManagedDataAccess.Client.OracleDataReader reader = cmd.ExecuteReader())
            {
                VorgangInpro vorgangInproHochbau = new VorgangInpro();

                while (reader.Read())
                {
                    v.Aktenzeichen = reader.GetString(0);
                    if (v.Aktenzeichen == string.Empty)
                    {
                        //Kandidat für Tiefensuche
                        continue;
                    }
                    vorgangInproHochbau.Nummer = v.Aktenzeichen.Substring(8);
                    v.VorgangsDefinition = reader.GetString(1);
                    vorgangInproHochbau.IdStrasse = reader.GetValue(2).ToString();
                    vorgangInproHochbau.Bezirk = v.Aktenzeichen.Split("-").ElementAt(1).ToString();
                    v.Strasse1 = reader.GetValue(3).ToString().Trim();
                    v.Hausnummer1 = reader.GetValue(4).ToString().Trim();
                    vorgangInproHochbau.Sachbearbeiter = reader.GetValue(5).ToString();
                    vorgangInproHochbau.ZdA = reader.GetValue(6).ToString();

                    vorgangInproHochbau.Eingangsdatum = reader.GetValue(7).ToString().Split(' ').FirstOrDefault();
                    
                    vorgangInproHochbau.Genehmigung = reader.GetValue(8).ToString() == null ? "" : reader.GetValue(8).ToString().Split(' ').FirstOrDefault();

                    vorgangInproHochbau.Freigabe = reader.GetValue(9).ToString();
                    vorgangInproHochbau.Statistik_Relevant = reader.GetValue(10).ToString();
                    vorgangInproHochbau.Statistik1 = reader.GetValue(11).ToString();
                    vorgangInproHochbau.Statistik2 = reader.GetValue(12).ToString();

                    vorgangInproHochbau.Genehmigung_Gemeldet = reader.GetValue(13).ToString() == null ? "" : reader.GetValue(13).ToString().Split(' ').FirstOrDefault();

                    vorgangInproHochbau.Fertigstellung_Gemeldet = reader.GetValue(14).ToString() == null ? "" : reader.GetValue(14).ToString().Split(' ').FirstOrDefault();
                    vorgangInproHochbau.Baubeginn = reader.GetValue(15).ToString() == null ? "" : reader.GetValue(15).ToString().Split(' ').FirstOrDefault();

                    vorgangInproHochbau.Teilrohbauabnahme = reader.GetValue(16).ToString() == null ? "" : reader.GetValue(16).ToString().Split(' ').FirstOrDefault();

                    vorgangInproHochbau.Rohbauabnahme = reader.GetValue(17).ToString() == null ? "" : reader.GetValue(17).ToString().Split(' ').FirstOrDefault();

                    vorgangInproHochbau.Schlussabnahme = reader.GetValue(18).ToString() == null ? "" : reader.GetValue(18).ToString().Split(' ').FirstOrDefault();


                    string tempDate = string.Empty;
                    if (tempDate == null)
                    {
                        vorgangInproHochbau.Vorjahr = "";
                    }
                    else
                    {
                        var splitted = tempDate.Split('.').LastOrDefault();
                        if (!string.IsNullOrEmpty(splitted))
                        {
                            vorgangInproHochbau.Vorjahr = splitted.Split(' ').FirstOrDefault();
                        }
                        else
                        {
                            vorgangInproHochbau.Vorjahr = string.Empty;
                        }
                    }

                    vorgangInproHochbau.Bauüberhang_Vorjahr = reader.GetValue(20).ToString();
                    vorgangInproHochbau.Aktenstandort = reader.GetValue(21).ToString();
                    vorgangInproHochbau.BaugenehmigungAusgeführt = reader.GetValue(22).ToString();
                }
                return vorgangInproHochbau;
            }
        }

        //Verbindet zur Datenbank, führt Query aus und füllt Inpro-Objekt, identifikator optional -> nur falls Tiefensuche nötig        
        public static VorgangInpro ConnectAndExecuteHochbau(Vorgang v, int identifikator = 0)
        {
            VorgangInpro vorgangInproHochbau;

            string sqlQuery;

            try
            {
                using (Oracle.ManagedDataAccess.Client.OracleConnection oracle = new Oracle.ManagedDataAccess.Client.OracleConnection())
                {
                    oracle.ConnectionString = conString;

                    if (identifikator != 0)
                    {
                        sqlQuery = GenerateQueryHochbau(v.Aktenzeichen, identifikator);
                    }
                    else
                    {
                        sqlQuery = GenerateQueryHochbau(v.Aktenzeichen);
                    }

                    using (Oracle.ManagedDataAccess.Client.OracleCommand com = new Oracle.ManagedDataAccess.Client.OracleCommand(sqlQuery, oracle))
                    {
                        vorgangInproHochbau = FillVorgangInproHochbau(oracle, com, v);
                    }
                }

                return vorgangInproHochbau;

            }
            catch (Exception ex)
            {
                //Fehler wird Benutzer angezeigt
                Console.WriteLine("Error {0}:{1}", v.Aktenzeichen, ex.Message);
                _logger.Error(ex.Message + " " + v.Aktenzeichen);
                
            }
            return null;
        }
    }
}

