using System;
using System.Collections.ObjectModel;
using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml.Linq;
using Microsoft.Data.Sqlite;
using SQLitePCL;

namespace Aborea_Projekt
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private MainWindow_Controler controler;
        private ObservableCollection<KaufObjekt> KaufListe = new ObservableCollection<KaufObjekt>();
        private readonly Datenbank _Datenbank;

        public MainWindow()
        {

            InitializeComponent();

            ImageSource imageSource = ConvertByteArrayToImageSource(Properties.Resources.Handel);
            // Erstelle einen ImageBrush mit der ImageSource
            ImageBrush imageBrush = new ImageBrush(imageSource);

            // Setze das Bild als Hintergrund des Fensters
            this.Background = imageBrush;

            // Controller initialisieren
            controler = new MainWindow_Controler();

            //DAtenbank erstellen
            _Datenbank = new();

            // SQLite initialisieren
            SQLitePCL.Batteries.Init();

            // Fenster beim Start maximieren
            this.WindowState = WindowState.Normal;

            // Event-Handler für Window Loaded registrieren
            this.Loaded += Window_Loaded;

           
        }

        // Event-Handler für das Window Loaded-Ereignis
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Initialize();
        }

        private void Initialize()
        {
            // Initialisiere die ComboBox mit den Daten aus dem Controller
            Combo.ItemsSource = controler.GetComboboxInhalt();
            // Definiere, welcher Teil des Objekts angezeigt wird
            Combo.DisplayMemberPath = "Item1"; // Zeigt nur den Namen (Item1 im Tuple)

            SelectionGrid.ItemsSource = KaufListe;

            ObjektAuswahlCombo.ItemsSource = controler.GetObjektAuswahlCombo();
        }


        public static ImageSource? ConvertByteArrayToImageSource(byte[] byteArray)
        {
            if (byteArray == null || byteArray.Length == 0)
                return null;

            try
            {
                // Erstelle einen MemoryStream aus dem Byte-Array
                using (MemoryStream stream = new MemoryStream(byteArray))
                {
                    // Erstelle ein BitmapImage aus dem MemoryStream
                    BitmapImage bitmapImage = new BitmapImage();
                    bitmapImage.BeginInit();
                    bitmapImage.StreamSource = stream;
                    bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                    bitmapImage.EndInit();

                    return bitmapImage;
                }
            }
            catch (Exception ex)
            {
                // Fehlerbehandlung
                MessageBox.Show($"Fehler beim Konvertieren des Byte-Arrays zu ImageSource: {ex.Message}");
                return null;
            }
        }



        private void AddSelection_Click(object sender, RoutedEventArgs e)
        {
            controler.AddSelection_Click(QuantityTextBox.Text, MerchantPercentageTextBox.Text, Combo.SelectedItem, KaufListe);
            RefreshSelectionGrid();
        }


        private void Combo_KeyUp(object sender, KeyEventArgs e)
        {

            controler.KeyUp(Combo.Text, Combo);
        }



        private void CalculateTotalPrice_Click(object sender, RoutedEventArgs e)
        {
                  
            TotalPriceDisplay.Text = "Gesamtpreis: " + controler.KomplettPreisBerechnen(KaufListe, MerchantGesPercentageTextBox.Text);
            TotalWightDisplay.Text = "Gesamtgewicht: " + controler.KompletGewichtBerechnen(KaufListe) + " kg";
        }

        private void DeleteButton_Click(object sender, RoutedEventArgs e)
        {
            if (sender is Button button && button.Tag is KaufObjekt itemToRemove)
            {
                // Element aus der ObservableCollection löschen
                if (KaufListe.Contains(itemToRemove))
                {
                    KaufListe.Remove(itemToRemove);
                    RefreshSelectionGrid();
                }
            }
        }

        private void MinusMengeButton_Click(object sender, RoutedEventArgs e)
        {
            if (sender is Button button && button.Tag is KaufObjekt itemToMinusMenge)
            {
                controler.MinusMenge(itemToMinusMenge);
                if (itemToMinusMenge.Menge == 0)
                {
                    KaufListe.Remove(itemToMinusMenge);
                }
                RefreshSelectionGrid();
                // Entferne das Objekt, wenn die Menge 0 ist

            }


        }

        private void PlusMengeButton_Click(object sender, RoutedEventArgs e)
        {
            if (sender is Button button && button.Tag is KaufObjekt itemToPlusMenge)
            {
                controler.PlusMenge(itemToPlusMenge);
                RefreshSelectionGrid();
            }
        }

        private void RefreshSelectionGrid()
        {
            SelectionGrid.ItemsSource = null;
            SelectionGrid.ItemsSource = KaufListe.OrderBy(k => k.Name).ToList();
        }

        private void ObjektHinzufügenButton_Click(object sender, RoutedEventArgs e)
        {

            if (ObjektAuswahlCombo.Text == "Rüstungsarten")
            {
                Rüstungsarten1.Visibility = Visibility.Visible;
                Rüstungsarten2.Visibility = Visibility.Visible;
                ObjektHinzufügen.Visibility = Visibility.Collapsed;
                GesamtpreisBerechnen.Visibility = Visibility.Collapsed;
                TotalPriceDisplay.Visibility = Visibility.Collapsed;
                TotalWightDisplay.Visibility = Visibility.Collapsed;
                HändlerGesamtProezent.Visibility = Visibility.Collapsed;
                Combo.Text = string.Empty;
                ObjektAuswahlCombo.Text = string.Empty;


            }
            if (ObjektAuswahlCombo.Text == "Gegenstände")
            {
                Gegenstände1.Visibility = Visibility.Visible;
                Gegenstände2.Visibility = Visibility.Visible;
                ObjektHinzufügen.Visibility = Visibility.Collapsed;
                GesamtpreisBerechnen.Visibility = Visibility.Collapsed;
                TotalPriceDisplay.Visibility = Visibility.Collapsed;
                TotalWightDisplay.Visibility = Visibility.Collapsed;
                HändlerGesamtProezent.Visibility = Visibility.Collapsed;
                Combo.Text = string.Empty;
                ObjektAuswahlCombo.Text = string.Empty;


            }


        }

        private void RüstungsartSpeichern_Click(object sender, RoutedEventArgs e)
        {

            MainWindow_Controler.SpeichereRüstungsart(txtRüstungsartName.Text, txtRüstungsartMinStärke.Text, txtRüstungsartRüstungBonus.Text, txtRüstungsartManöver.Text, txtRüstungsartKostenTT.Text, txtGRüstungsartGewicht.Text);

            // Sichtbarkeit der UI-Komponenten steuern
            GesamtpreisBerechnen.Visibility = Visibility.Visible;
            TotalPriceDisplay.Visibility = Visibility.Visible;
            TotalWightDisplay.Visibility = Visibility.Visible;
            HändlerGesamtProezent.Visibility = Visibility.Visible;
            Rüstungsarten1.Visibility = Visibility.Collapsed;
            Rüstungsarten2.Visibility = Visibility.Collapsed;
            ObjektHinzufügen.Visibility = Visibility.Visible;
            controler.ClearUserInputs(Rüstungsarten1);
            controler.ClearUserInputs(Rüstungsarten2 );


            ObjektAuswahlCombo.ItemsSource = controler.GetObjektAuswahlCombo();

        }


        private void GegenstandSpeichern_Click(object sender, RoutedEventArgs e)
        {
            MainWindow_Controler.SpeichereGegenstand(txtGegenstandName.Text, txtGegenstandGewicht.Text, txtGegenstandKostenTT.Text, txtGegenstandHäufigkeit.Text, txtGegenstandFunktion.Text);


            // UI-Elemente anpassen
            GesamtpreisBerechnen.Visibility = Visibility.Visible;
            TotalPriceDisplay.Visibility = Visibility.Visible;
            TotalWightDisplay.Visibility = Visibility.Visible;
            HändlerGesamtProezent.Visibility = Visibility.Visible;
            Gegenstände1.Visibility = Visibility.Collapsed;
            Gegenstände2.Visibility = Visibility.Collapsed;
            ObjektHinzufügen.Visibility = Visibility.Visible;
            controler.ClearUserInputs(Gegenstände1);
            controler.ClearUserInputs(Gegenstände2);

            ObjektAuswahlCombo.ItemsSource = controler.GetObjektAuswahlCombo();

        }

        private void RüstungsartAbbrechen_Click(object sender, RoutedEventArgs e)
        {
            controler.ClearUserInputs(Rüstungsarten2);
            controler.ClearUserInputs(Rüstungsarten1);
            GesamtpreisBerechnen.Visibility = Visibility.Visible;
            TotalPriceDisplay.Visibility = Visibility.Visible;
            TotalWightDisplay.Visibility = Visibility.Visible;
            HändlerGesamtProezent.Visibility = Visibility.Visible;
            Rüstungsarten1.Visibility = Visibility.Collapsed;
            Rüstungsarten2.Visibility = Visibility.Collapsed;
            ObjektHinzufügen.Visibility = Visibility.Visible;

        }

        private void GegenstandAbbrechen_Click(object sender, RoutedEventArgs e)
        {
            controler.ClearUserInputs(Gegenstände1);
            controler.ClearUserInputs(Gegenstände2);

            GesamtpreisBerechnen.Visibility = Visibility.Visible;
            TotalPriceDisplay.Visibility = Visibility.Visible;
            TotalWightDisplay.Visibility = Visibility.Visible;
            HändlerGesamtProezent.Visibility = Visibility.Visible;
            Gegenstände1.Visibility = Visibility.Collapsed;
            Gegenstände2.Visibility = Visibility.Collapsed;
            ObjektHinzufügen.Visibility = Visibility.Visible;
        }

        
        private void ObjektLöschenButton_Click(object sender, RoutedEventArgs e)
        {



            if (ObjektAuswahlCombo.Text == "Rüstungsarten")
            {
                Rüstung_Löschen.Visibility = Visibility.Visible;
                ObjektHinzufügen.Visibility = Visibility.Collapsed;
                GesamtpreisBerechnen.Visibility = Visibility.Collapsed;
                TotalPriceDisplay.Visibility = Visibility.Collapsed;
                TotalWightDisplay.Visibility = Visibility.Collapsed;
                HändlerGesamtProezent.Visibility = Visibility.Collapsed;
                Combo.Text = string.Empty;
                ObjektAuswahlCombo.Text = string.Empty;


            }
            if (ObjektAuswahlCombo.Text == "Gegenstände")
            {
                Gegenstand_Löschen.Visibility = Visibility.Visible;
                ObjektHinzufügen.Visibility = Visibility.Collapsed;
                GesamtpreisBerechnen.Visibility = Visibility.Collapsed;
                TotalPriceDisplay.Visibility = Visibility.Collapsed;
                TotalWightDisplay.Visibility = Visibility.Collapsed;
                HändlerGesamtProezent.Visibility = Visibility.Collapsed;
                Combo.Text = string.Empty;
                ObjektAuswahlCombo.Text= string.Empty;

            }

        }

        private void GegenstandLöschen_Click(object sender, RoutedEventArgs e)
        {
            controler.GegenstandLöschen(NameObjektLöschenGegenstand.Text);

            GesamtpreisBerechnen.Visibility = Visibility.Visible;
            TotalPriceDisplay.Visibility = Visibility.Visible;
            TotalWightDisplay.Visibility = Visibility.Visible;
            HändlerGesamtProezent.Visibility = Visibility.Visible;
            Gegenstand_Löschen.Visibility = Visibility.Collapsed;
            ObjektHinzufügen.Visibility = Visibility.Visible;

            controler.ClearUserInputs(Gegenstand_Löschen);

            ObjektAuswahlCombo.ItemsSource = controler.GetObjektAuswahlCombo();


        }

        private void GegenstandLöschenAbbrechen_Click(object sender, RoutedEventArgs e)
        {
            controler.ClearUserInputs(Gegenstand_Löschen);

            GesamtpreisBerechnen.Visibility = Visibility.Visible;
            TotalPriceDisplay.Visibility = Visibility.Visible;
            TotalWightDisplay.Visibility = Visibility.Visible;
            HändlerGesamtProezent.Visibility = Visibility.Visible;
            Gegenstand_Löschen.Visibility = Visibility.Collapsed;           
            ObjektHinzufügen.Visibility = Visibility.Visible;

        }

        private void RüstungLöschen_Click(object sender, RoutedEventArgs e)
        {
            controler.RüstungLöschen(NameObjektLöschenRüstung.Text);

            GesamtpreisBerechnen.Visibility = Visibility.Visible;
            TotalPriceDisplay.Visibility = Visibility.Visible;
            TotalWightDisplay.Visibility = Visibility.Visible;
            HändlerGesamtProezent.Visibility = Visibility.Visible;
            Rüstung_Löschen.Visibility = Visibility.Collapsed;
            ObjektHinzufügen.Visibility = Visibility.Visible;

            controler.ClearUserInputs(Rüstung_Löschen);

            ObjektAuswahlCombo.ItemsSource = controler.GetObjektAuswahlCombo();


        }

        private void RüstungLöschenAbbrechen_Click(object sender, RoutedEventArgs e)
        {
            controler.ClearUserInputs(Rüstung_Löschen);

            GesamtpreisBerechnen.Visibility = Visibility.Visible;
            TotalPriceDisplay.Visibility = Visibility.Visible;
            TotalWightDisplay.Visibility = Visibility.Visible;
            HändlerGesamtProezent.Visibility = Visibility.Visible;
            Rüstung_Löschen.Visibility = Visibility.Collapsed;           
            ObjektHinzufügen.Visibility = Visibility.Visible;

        }

    }
    
}
