using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json.Serialization;
using Newtonsoft.Json;
using System.ComponentModel.DataAnnotations.Schema;
using Parser_Xls_Integral;
using System.Data;


public class ExcelParser
{
    public static void Main(string[] args)
    {
        List<DefinicneUseky> definicneUsekyList = new List<DefinicneUseky>();

        #region DefinicneUseky
        string filePath = "Definicne_useky_05_2024.xls";
        using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
        {
            HSSFWorkbook workbook = new HSSFWorkbook(file);
            ISheet sheet = workbook.GetSheetAt(0); 

            for (int i = 1; i <= sheet.LastRowNum; i++)
            {
                IRow row = sheet.GetRow(i);

                DefinicneUseky rowData = new DefinicneUseky
                {
                    ID = row.GetCell(0)?.ToString(),
                    TU = row.GetCell(1)?.ToString(),
                    DU = row.GetCell(2)?.ToString(),
                    Od = row.GetCell(3)?.ToString(),
                    Do = row.GetCell(4)?.ToString(),
                    KmOd = row.GetCell(5)?.ToString(),
                    KmDo = row.GetCell(6)?.ToString(),
                    Kolajnost = row.GetCell(7)?.ToString(),
                    ElektrickaTrakcia = row.GetCell(8)?.ToString(),
                    ElektrickaTrakciaN = row.GetCell(9)?.ToString(),
                    StavebnaDlzka = row.GetCell(10)?.ToString(),
                    VysokorychlostnaTrat = row.GetCell(11)?.ToString(),
                    TichsiaTrat = row.GetCell(12)?.ToString(),
                    KategoriaTrate = row.GetCell(13)?.ToString(),
                    ReakcnyCasZZ = row.GetCell(14)?.ToString(),
                    PriznakStanicenia = row.GetCell(15)?.ToString(),
                    PriznakStaniceDefinicnyUsek = row.GetCell(16)?.ToString(),
                    CharakterTrate = row.GetCell(17)?.ToString(),
                    TypDopravy = row.GetCell(18)?.ToString(),
                    TypPrevadzky = row.GetCell(19)?.ToString(),
                    TypTrateTEN = row.GetCell(20)?.ToString(),
                    Poznamka = row.GetCell(21)?.ToString(),
                    KategoriaZatazenia = row.GetCell(22)?.ToString()
                };

                Console.WriteLine($"ID: {rowData.ID}, TU: {rowData.TU}, DU: {rowData.DU}, Od: {rowData.Od}, Do: {rowData.Do}, " +
                                 $"KmOd: {rowData.KmOd}, KmDo: {rowData.KmDo}, Kolajnost: {rowData.Kolajnost}, " +
                                 $"ElektrickaTrakcia: {rowData.ElektrickaTrakcia}, ElektrickaTrakciaN: {rowData.ElektrickaTrakciaN}, " +
                                 $"StavebnaDlzka: {rowData.StavebnaDlzka}, VysokorychlostnaTrat: {rowData.VysokorychlostnaTrat}, " +
                                 $"TichsiaTrat: {rowData.TichsiaTrat}, KategoriaTrate: {rowData.KategoriaTrate}, " +
                                 $"ReakcnyCasZZ: {rowData.ReakcnyCasZZ}, PriznakStanicenia: {rowData.PriznakStanicenia}, " +
                                 $"PriznakStaniceDefinicnyUsek: {rowData.PriznakStaniceDefinicnyUsek}, CharakterTrate: {rowData.CharakterTrate}, " +
                                 $"TypDopravy: {rowData.TypDopravy}, TypPrevadzky: {rowData.TypPrevadzky}, TypTrateTEN: {rowData.TypTrateTEN}, " +
                                 $"Poznamka: {rowData.Poznamka}, KategoriaZatazenia: {rowData.KategoriaZatazenia}");
                definicneUsekyList.Add(rowData);

                // You can now store or process rowData as needed.
            }
        }
        #endregion
        
  
      
    }

    // Sheet 1: Prehľad: Priepusty za celú dopravnú cestu
    public static List<Priepusty> ParsePrehledPriepusty(DataTable table)
    {
        return (from DataRow row in table.Rows
                select new Priepusty
                {
                    OR = row["OR"].ToString(),
                    Spravca = row["Spravca"].ToString(),
                    TU = row["TU"].ToString(),
                    DU = row["DU"].ToString(),
                    Rozchod = row["Rozchod"].ToString(),
                    Kategoria = row["Kategoria"].ToString(),
                    OznačenieRozchodu = row["Oznacenie rozchodu"].ToString(),
                    Trakcia = row["Trakcia"].ToString(),
                    Koridory = row["Koridory"].ToString(),
                    KategoriaZatazeniaTrate = row["Kategoria zatazenia trate"].ToString(),
                    CisloTTP = row["Cislo TTP"].ToString(),
                    JICPriepustu = row["JIC priepustu"].ToString(),
                    KmPolohaStreduPriepustu = row["Km poloha stredu priepustu"].ToString(),
                    InterneCisloSAP = row["Interne cislo SAP"].ToString(),
                    TypPriepustu = row["Typ priepustu"].ToString(),
                    Umiestnenie = row["Umiestnenie"].ToString(),
                    TechMiestoUdrzby = row["Technicke miesto udrzby"].ToString(),
                    ObstaravaciaCena = row["Obstaravacia cena"].ToString(),
                    RokStavbyOpor = row["Rok stavby opor"].ToString(),
                    RokPrestavbyOpor = row["Rok prestavby opor"].ToString(),
                    CelkovyPocetKolajiNaPriepuste = row["Celkovy pocet kolaji na priepuste"].ToString(),
                    PocetNosnychKonstrukcii = row["Pocet nosnych konstrukcii"].ToString(),
                    KolajoveRozvetvenie = row["Kolajove rozvetvenie"].ToString(),
                    KolajoveStyky = row["Kolajove styky"].ToString(),
                    UmiestnenieKabelovehoZlaby = row["Umiestnenie kabeloveho zlaby"].ToString(),
                    ZemSirka = row["Zem. šírka"].ToString(),
                    ZemDlzka = row["Zem. dĺžka"].ToString(),
                    Obec = row["Obec"].ToString(),
                    Kataster = row["Kataster"].ToString(),
                    Okres = row["Okres"].ToString(),
                    Kraj = row["Kraj"].ToString(),
                    DlzkaPriepustu = row["Dlzka priepustu"].ToString(),
                    VyskaPriepustu = row["Vyska priepustu"].ToString(),
                    SirkaPriepustu = row["Sirka priepustu"].ToString(),
                    CelkDlzkaNKPriepustu = row["Celk. dlzka NK priepustu"].ToString(),
                    PocetPoliRur = row["Pocet poli rur"].ToString(),
                    Vyska1Opory = row["Vyska 1 opory"].ToString(),
                    Vyska2Opory = row["Vyska 2 opory"].ToString(),
                    StatickySystem1Opory = row["Statický systém 1. opory"].ToString(),
                    StatickySystem2Opory = row["Statický systém 2. opory"].ToString(),
                    DruhKridel1Opory = row["Druh krídel 1. opory"].ToString(),
                    DruhKridel2Opory = row["Druh krídel 2. opory"].ToString(),
                    SucetVysokOpor = row["Súčet výšok opôr"].ToString(),
                    MaterialOpor = row["Materiál opôr"].ToString(),
                    KategoriaZatazeniaStavby = row["Kategoria zatazenia stavby"].ToString(),
                    ZatazitelnostPriepustu = row["Zatažiteľnosť priepustu"].ToString(),
                    StavNosnejKonstrukcie = row["Stav nosnej konstrukcie"].ToString(),
                    StavSpodnejStavby = row["Stav spodnej stavby"].ToString(),
                    HodnotenieStavuObjektu = row["Hodnotenie stavu objektu"].ToString()
                }).ToList();
    }

    // Sheet 2: Prehľad: Obmedzujúce prvky za celú dopravnú cestu
    public static List<ObmedzujucePrvky> ParsePrehledObmedzujucePrvky(DataTable table)
    {
        return (from DataRow row in table.Rows
                select new ObmedzujucePrvky
                {
                    OR = row["OR"].ToString(),
                    Spravca = row["Spravca"].ToString(),
                    CisloTU = row["Cislo TU"].ToString(),
                    CisloDU = row["Cislo DU"].ToString(),
                    JICPriepustu = row["JIC priepustu"].ToString(),
                    TypPriepustu = row["Typ priepustu"].ToString(),
                    ObmedzujuciPrvok = row["Obmedzujuci prvok"].ToString(),
                    CelkovaDlzka = row["Celkova dlzka"].ToString(),
                    VzdialenostOdLavejKolaje = row["Vzdialenost od lavej kolaje"].ToString(),
                    VzdialenostOdPravejKolaje = row["Vzdialenost od pravej kolaje"].ToString()
                }).ToList();
    }

    // Sheet 3: Prehľad: Premostené prekážky za celú dopravnú cestu
    public static List<PremostenePrekazky> ParsePrehledPremostenePrekazky(DataTable table)
    {
        return (from DataRow row in table.Rows
                select new PremostenePrekazky
                {
                    OR = row["OR"].ToString(),
                    Spravca = row["Spravca"].ToString(),
                    CisloTU = row["Cislo TU"].ToString(),
                    CisloDU = row["Cislo DU"].ToString(),
                    JICPriepustu = row["JIC priepustu"].ToString(),
                    TypPriepustu = row["Typ priepustu"].ToString(),
                    TypPrekazky = row["Typ prekážky"].ToString(),
                    BlizsiPopis = row["Blizší popis"].ToString(),
                    VolnaVyskaNadPriepustom = row["Volná výška nad priepustom"].ToString(),
                    StorocnyPrietok = row["Sto ročný prietok"].ToString(),
                    Poznamka = row["Poznámka"].ToString()
                }).ToList();
    }

    // Sheet 4: Prehľad: Svetlosť za celú dopravnú cestu
    public static List<Svetlost> ParsePrehledSvetlost(DataTable table)
    {
        return (from DataRow row in table.Rows
                select new Svetlost
                {
                    OR = row["OR"].ToString(),
                    Spravca = row["Spravca"].ToString(),
                    CisloTU = row["Cislo TU"].ToString(),
                    CisloDU = row["Cislo DU"].ToString(),
                    JICPriepustu = row["JIC priepustu"].ToString(),
                    TypPriepustu = row["Typ priepustu"].ToString(),
                    SvetlostPriepustu = row["Svetlosť priepustu"].ToString(),
                    DlzkaPriepustu = row["Dlžka priepustu"].ToString(),
                    VyskaPriepustu = row["Výška priepustu"].ToString(),
                    SirkaPriepustu = row["Šírka priepustu"].ToString(),
                    HlbkaPriepustu = row["Hlbka priepustu"].ToString()
                }).ToList();
    }

    // Sheet 5: Prehľad: Dĺžka za celú dopravnú cestu
    public static List<PrehladDlzka> ParsePrehledDlzka(DataTable table)
    {
        return (from DataRow row in table.Rows
                select new PrehladDlzka
                {
                    OR = row["OR"].ToString(),
                    Spravca = row["Spravca"].ToString(),
                    CisloTU = row["Cislo TU"].ToString(),
                    CisloDU = row["Cislo DU"].ToString(),
                    JICPriepustu = row["JIC priepustu"].ToString(),
                    TypPriepustu = row["Typ priepustu"].ToString(),
                    Dlzka = row["Dlzka"].ToString()
                }).ToList();
    }

    // Sheet 6: Prehľad: Šírka za celú dopravnú cestu
    public static List<Sirka> ParsePrehledSirka(DataTable table)
    {
        return (from DataRow row in table.Rows
                select new Sirka
                {
                    OR = row["OR"].ToString(),
                    Spravca = row["Spravca"].ToString(),
                    CisloTU = row["Cislo TU"].ToString(),
                    CisloDU = row["Cislo DU"].ToString(),
                    JICPriepustu = row["JIC priepustu"].ToString(),
                    TypPriepustu = row["Typ priepustu"].ToString(),
                    Sirka = row["Šírka"].ToString()
                }).ToList();
    }

    // Sheet 7: Prehľad: Výška za celú dopravnú cestu
    public static List<Vyska> ParsePrehledVyska(DataTable table)
    {
        return (from DataRow row in table.Rows
                select new Vyska
                {
                    OR = row["OR"].ToString(),
                    Spravca = row["Spravca"].ToString(),
                    CisloTU = row["Cislo TU"].ToString(),
                    CisloDU = row["Cislo DU"].ToString(),
                    JICPriepustu = row["JIC priepustu"].ToString(),
                    TypPriepustu = row["Typ priepustu"].ToString(),
                    Vyska = row["Výška"].ToString()
                }).ToList();
    }

    // Sheet 8: Prehľad: Odkaz za celú dopravnú cestu
    public static List<PrehledOdkaz> ParsePrehledOdkaz(DataTable table)
    {
        return (from DataRow row in table.Rows
                select new PrehledOdkaz
                {
                    OR = row["OR"].ToString(),
                    Spravca = row["Spravca"].ToString(),
                    CisloTU = row["Cislo TU"].ToString(),
                    CisloDU = row["Cislo DU"].ToString(),
                    JICPriepustu = row["JIC priepustu"].ToString(),
                    TypPriepustu = row["Typ priepustu"].ToString(),
                    Odkaz = row["Odkaz"].ToString()
                }).ToList();
    }

    // Sheet 9: Prehľad: Poznámka za celú dopravnú cestu
    public static List<Poznamka> ParsePrehledPoznamka(DataTable table)
    {
        return (from DataRow row in table.Rows
                select new Poznamka
                {
                    OR = row["OR"].ToString(),
                    Spravca = row["Spravca"].ToString(),
                    CisloTU = row["Cislo TU"].ToString(),
                    CisloDU = row["Cislo DU"].ToString(),
                    JICPriepustu = row["JIC priepustu"].ToString(),
                    TypPriepustu = row["Typ priepustu"].ToString(),
                    Poznamka = row["Poznámka"].ToString()
                }).ToList();
    }
}
