using Hochbaustatistik.Business;
using Hochbaustatistik.Database;
using Hochbaustatistik.Utilities;
using OpenQA.Selenium.DevTools.V109.Target;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using Xunit;

namespace Hochbaustatistik.Testing.Utilities
{
    public class DataOpsTest
    {       
        public readonly VorgangInpro vorgang = new VorgangInpro() { Schlussabnahme = "2022" };
               
        [Theory]
        [InlineData("61/5-2-052875", "615-2-052875")]
        public void IsValidTest(string trueAz, string falseAZ)
        {
            var instance = DataOpsSingleton.Instance;

            Assert.True(instance.IsValid(trueAz));
            Assert.False(instance.IsValid(falseAZ));
        }

        [Theory]
        [InlineData("615-2-052875", "61/5-2-052870255", "61/5-4-050497/1", "6175-4-052875", "61/5-3-49044", "61/52052702", "Tiefe-Mark 20")]
        public void CorrectAZTest(string az1, string az2, string az3, string az4, string az5, string az6, string az7)
        {
            var instance = DataOpsSingleton.Instance;

            var expected1 = "61/5-2-052875";
            var expected2 = "NOT_CORRECTED";
            var expected3 = "61/5-4-050497";
            var expected4 = "61/5-4-052875";
            var expected5 = "61/5-3-049044";
            var expected6 = "61/5-2-052702";
            var expected7 = "NOT_CORRECTED";

            Assert.Equal(expected1, instance.CorrectAZ(az1));
            Assert.Equal(expected2, instance.CorrectAZ(az2));
            Assert.Equal(expected3, instance.CorrectAZ(az3));
            Assert.Equal(expected4, instance.CorrectAZ(az4));
            Assert.Equal(expected5, instance.CorrectAZ(az5));
            Assert.Equal(expected6, instance.CorrectAZ(az6));
            Assert.Equal(expected7, instance.CorrectAZ(az7));
        }


        [Theory]
        [InlineData("50001234567")]
        public void ReshapeIdentifikatorTest(string ident)
        {
            var instance = DataOpsSingleton.Instance;
            var expected = "1234567";
            var actual = instance.ReshapeIdentifikator(ident);
            Assert.Equal(expected, actual);
        }
              
        [Fact]
        public void CreateItnrwRecordTest()
        {
            var instance = DataOpsSingleton.Instance;
            List<VorgangItnrw> hochbauliste = new List<VorgangItnrw>();
            hochbauliste.Add(new VorgangItnrw()   
            {                
                AGS = "913000",
                Identifikator = "50005733064",
                BauscheinNr = "61/5-2-43665",
                MonatGenehmigung = "5",
                JahrGenehmigung = "2017",
                NameBauherr = " ",
                Strasse = "Rüschenstr. 29",
                PLZ = "44328",
                Gemeinde = "Dortmund",
                Gemeindeteil = " ",
                Bauzustand = " ",
                Bemerkungen = " "
            });

            var correctedAZ = "61/5-2-043665";
            var origAZ = "61/5-2-43665";
            var row = 57;

            var hochbauListe = FileOperations.GenerateHochbauVorgangFromCSV(@"..\..\..\TestData\Testdata.csv");
            
            var actual = instance.CreateItnrwRecord(row, correctedAZ, origAZ,hochbauListe);
            var expected = String.Concat("913000;", "50005733064;", "61/5-2-043665;", "5;", "2017;", " ;", "Rüschenstr. 29;", "44328;", "Dortmund;", " ;");
            
            Assert.Equal(expected, actual);

        }
              
        [Fact]
        public void CreateStatusBauzustandTest()
        {
            var instance = DataOpsSingleton.Instance;
            List<string> actuals = new List<string>();

            List<VorgangInpro> inproVorgänge = new List<VorgangInpro>()
            {
                new VorgangInpro{ Schlussabnahme = "2022" },
                new VorgangInpro { BaugenehmigungAusgeführt ="2022"}
            };

            foreach (var item in inproVorgänge)
            {
                actuals.Add(instance.CreateStatusBauzustand(item));
            }
                    
            var expected1 = "F Fertigstellung erfolgte bis 31.12. des Vorjahres";
            var expected2 = "4 Baugenehmigung erloschen";

            Assert.Equal(expected1, actuals.ElementAt(0));
            Assert.Equal(expected2, actuals.ElementAt(1));
        }

        [Fact(Skip = "Keine Datenbank-Verbindung möglich")]
        public void MergeInproWithITNRWTest()
        {
            var resultFile = @"C:\TEMP\hochbaustatistik.csv";
            DatabaseOperations.conString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dborap04.stadtdo.de)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=bgvp.stadtdo.de)));user id=leser;password=leser;";
            var instance = DataOpsSingleton.Instance;

            List<VorgangItnrw> hochbauliste = new List<VorgangItnrw>();
            hochbauliste.Add(new VorgangItnrw()
            {
                AGS = "913000",
                Identifikator = "50005733064",
                BauscheinNr = "61/5-2-43665",
                MonatGenehmigung = "5",
                JahrGenehmigung = "2017",
                NameBauherr = " ",
                Strasse = "Rüschenstr. 29",
                PLZ = "44328",
                Gemeinde = "Dortmund",
                Gemeindeteil = " ",
                Bauzustand = " ",
                Bemerkungen = " "
            });

            instance.MergeInproWithITNRW(resultFile, hochbauliste);
            Assert.True(File.Exists(resultFile));
            var result = SearchEntry(resultFile, hochbauliste[0].PLZ);
            Assert.True(result);
        }

        private bool SearchEntry(string file, string text)
        {
            bool found = false;

            using (StreamReader sr = new StreamReader(file))
            {
                var fullText = sr.ReadToEnd();  
                found = fullText.Contains(text);              
            }

            return found;
        }

        public static IEnumerable<object[]> Vorgänge()
        {
           var vorgänge = new List<VorgangInpro>
            {
                new VorgangInpro { Schlussabnahme = "2022" },
                new VorgangInpro { Fertigstellung_Gemeldet = "2022" },
                new VorgangInpro { BaugenehmigungAusgeführt = "2022"}
            };

            yield return new object[] { vorgänge };
        }

        public static IEnumerable<object[]> Hochbauliste()
        {
            var hochbauliste = new List<VorgangItnrw>
            {
                new VorgangItnrw {
                AGS = "913000",
                Identifikator = "50005733064",
                BauscheinNr = "61/5-2-43665",
                MonatGenehmigung = "5",
                JahrGenehmigung = "2017",
                NameBauherr = " ",
                Strasse = "Rüschenstr. 29",
                PLZ = "44328",
                Gemeinde = "Dortmund",
                Gemeindeteil = " ",
                Bauzustand = " ",
                Bemerkungen = " "}
            };
         
            yield return new object[] { hochbauliste };
        }
    }
}
