using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using Microsoft.Win32;

namespace FahrzeugVerwaltung
{
    public partial class MainWindow : Window
    {
        private DatabaseService _datenbankDienst;
        private PdfService _pdfDienst;
        private List<Fahrzeug> _fahrzeuge;
        private Fahrzeug _ausgewaehltesFahrzeug;
        private Dictionary<string, List<string>> _markenModelle;

        public MainWindow()
        {
            InitializeComponent();
            DiensteAnlegen();
            MarkenVorbereiten();
            FahrzeugeLaden();
        }
        // Legt Dienste an
        private void DiensteAnlegen()
        {
            _datenbankDienst = new DatabaseService();
            _pdfDienst = new PdfService();
            _fahrzeuge = new List<Fahrzeug>();
        }

        // Bereitet Marken und Modelle vor
        private void MarkenVorbereiten()
        {
            _markenModelle = new Dictionary<string, List<string>>
            {
                {"Audi", new List<string>{"A3","A4","A6","Q3","Q5","Q7"}},
                {"BMW", new List<string>{"1er","3er","5er","X1","X3","X5"}},
                {"Mercedes", new List<string>{"A-Klasse","C-Klasse","E-Klasse","GLA","GLC","GLE"}},
                {"Volkswagen", new List<string>{"Golf","Passat","Polo","Tiguan","T-Roc","Arteon"}},
                {"Opel", new List<string>{"Corsa","Astra","Insignia","Mokka","Crossland","Grandland"}},
                {"Ford", new List<string>{"Fiesta","Focus","Mondeo","Kuga","Puma","S-MAX"}},
                {"Toyota", new List<string>{"Yaris","Corolla","Camry","RAV4","C-HR","Auris"}},
                {"Honda", new List<string>{"Civic","Accord","Jazz","CR-V","HR-V","NSX"}},
                {"Hyundai", new List<string>{"i20","i30","i40","Tucson","Santa Fe","Kona"}},
                {"Nissan", new List<string>{"Micra","Juke","Qashqai","X-Trail","Leaf","Navara"}},
                {"Kia", new List<string>{"Rio","Ceed","Sportage","Sorento","Picanto","Stonic"}},
                {"Mazda", new List<string>{"Mazda2","Mazda3","Mazda6","CX-3","CX-5","MX-5"}},
                {"Peugeot", new List<string>{"208","308","508","2008","3008","5008"}},
                {"Renault", new List<string>{"Clio","Megane","Talisman","Captur","Kadjar","Scenic"}},
                {"Skoda", new List<string>{"Fabia","Octavia","Superb","Kodiaq","Karoq","Scala"}},
                {"Seat", new List<string>{"Ibiza","Leon","Ateca","Arona","Tarraco","Toledo"}},
                {"Fiat", new List<string>{"500","Panda","Tipo","Punto","Doblo","Bravo"}},
                {"Volvo", new List<string>{"S60","S90","V60","V90","XC60","XC90"}},
                {"Subaru", new List<string>{"Impreza","Legacy","Outback","Forester","XV","BRZ"}},
                {"Tesla", new List<string>{"Model S","Model 3","Model X","Model Y","Roadster","Cybertruck"}},
                {"Chevrolet", new List<string>{"Spark","Cruze","Malibu","Equinox","Traverse","Tahoe"}},
                {"Jaguar", new List<string>{"XE","XF","XJ","F-Pace","E-Pace","I-Pace"}},
                {"Jeep", new List<string>{"Renegade","Compass","Cherokee","Grand Cherokee","Wrangler","Gladiator"}},
                {"Land Rover", new List<string>{"Discovery Sport","Discovery","Range Rover Evoque","Range Rover Sport","Defender","Velar"}},
                {"Lexus", new List<string>{"IS","ES","GS","RX","NX","LC"}},
                {"Mitsubishi", new List<string>{"Space Star","Lancer","Outlander","ASX","Eclipse Cross","Pajero"}},
                {"Porsche", new List<string>{"911","Cayenne","Panamera","Macan","Taycan","Boxster"}},
                {"Citroën", new List<string>{"C1","C3","C4","C5","C3 Aircross","Berlingo"}},
                {"Alfa Romeo", new List<string>{"Giulia","Giulietta","Stelvio","MiTo","4C","Tonale"}},
                {"Mini", new List<string>{"One","Cooper","Clubman","Countryman","Cabrio","Paceman"}}
            };

            cmbMarke.ItemsSource = _markenModelle.Keys;
        }

        // Lädt Fahrzeuge aus der Datenbank
        private void FahrzeugeLaden()
        {
            _fahrzeuge = _datenbankDienst.LadeAlleFahrzeuge();
            dgFahrzeuge.ItemsSource = _fahrzeuge;
            StatusAktualisieren();
        }

        // Zeigt Anzahl der Fahrzeuge
        private void StatusAktualisieren()
        {
            if (_fahrzeuge.Count == 0)
                txtDetails.Text = "Keine Fahrzeuge vorhanden";
            else
                txtDetails.Text = $"{_fahrzeuge.Count} Fahrzeug(e) gefunden";
        }

        // Fügt Fahrzeug hinzu
        private void BtnHinzufuegen_Click(object sender, RoutedEventArgs e)
        {
            if (!EingabenPruefen())
                return;

            var fahrzeug = new Fahrzeug
            {
                Marke = cmbMarke.SelectedItem.ToString(),
                Modell = cmbModell.SelectedItem.ToString(),
                Baujahr = int.Parse(txtBaujahr.Text.Trim()),
                Leistung = int.Parse(txtLeistung.Text.Trim()),
                Kilometerstand = int.Parse(txtKilometer.Text.Trim()),
                Kaufpreis = decimal.Parse(txtKaufpreis.Text.Trim()),
                Farbe = txtFarbe.Text.Trim()
            };

            fahrzeug.Id = _datenbankDienst.SpeichereFahrzeug(fahrzeug);
            MessageBox.Show("Fahrzeug gespeichert.", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information);
            EingabenLeeren();
            FahrzeugeLaden();
        }

        // Speichert Änderungen
        private void BtnBearbeiten_Click(object sender, RoutedEventArgs e)
        {
            if (_ausgewaehltesFahrzeug == null || !EingabenPruefen())
                return;

            _ausgewaehltesFahrzeug.Marke = cmbMarke.SelectedItem.ToString();
            _ausgewaehltesFahrzeug.Modell = cmbModell.SelectedItem.ToString();
            _ausgewaehltesFahrzeug.Baujahr = int.Parse(txtBaujahr.Text.Trim());
            _ausgewaehltesFahrzeug.Leistung = int.Parse(txtLeistung.Text.Trim());
            _ausgewaehltesFahrzeug.Kilometerstand = int.Parse(txtKilometer.Text.Trim());
            _ausgewaehltesFahrzeug.Kaufpreis = decimal.Parse(txtKaufpreis.Text.Trim());
            _ausgewaehltesFahrzeug.Farbe = txtFarbe.Text.Trim();

            if (_datenbankDienst.AktualisiereFahrzeug(_ausgewaehltesFahrzeug))
                MessageBox.Show("Fahrzeug aktualisiert.", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information);
            FahrzeugeLaden();
        }

        // Löscht ausgewähltes Fahrzeug
        private void BtnLoeschen_Click(object sender, RoutedEventArgs e)
        {
            if (_ausgewaehltesFahrzeug == null)
                return;

            if (MessageBox.Show("Fahrzeug wirklich löschen?", "Bestätigung", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
            {
                if (_datenbankDienst.LoescheFahrzeug(_ausgewaehltesFahrzeug.Id))
                {
                    MessageBox.Show("Fahrzeug gelöscht.", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information);
                    EingabenLeeren();
                    FahrzeugeLaden();
                }
            }
        }

        // Prüft Eingaben
        private bool EingabenPruefen()
        {
            var fehler = new List<string>();

            if (cmbMarke.SelectedItem == null)
                fehler.Add("Marke wählen");
            if (cmbModell.SelectedItem == null)
                fehler.Add("Modell wählen");
            if (!int.TryParse(txtBaujahr.Text, out int baujahr) || baujahr < 1900 || baujahr > DateTime.Now.Year)
                fehler.Add($"Baujahr zwischen 1900 und {DateTime.Now.Year}");
            if (!int.TryParse(txtLeistung.Text, out int leistung) || leistung <= 0)
                fehler.Add("Leistung muss positiv sein");
            if (!int.TryParse(txtKilometer.Text, out int kilometer) || kilometer < 0)
                fehler.Add("Kilometerstand muss 0 oder größer sein");
            if (!decimal.TryParse(txtKaufpreis.Text, out decimal kaufpreis) || kaufpreis <= 0)
                fehler.Add("Kaufpreis muss positiv sein");
            if (string.IsNullOrWhiteSpace(txtFarbe.Text))
                fehler.Add("Farbe angeben");

            if (fehler.Any())
            {
                MessageBox.Show(string.Join("\n", fehler), "Eingabefehler", MessageBoxButton.OK, MessageBoxImage.Warning);
                return false;
            }

            return true;
        }

        // Leert Eingaben
        private void EingabenLeeren()
        {
            cmbMarke.SelectedIndex = -1;
            cmbModell.ItemsSource = null;
            txtBaujahr.Clear();
            txtLeistung.Clear();
            txtKilometer.Clear();
            txtKaufpreis.Clear();
            txtFarbe.Clear();
            cmbMarke.Focus();
        }

        // Sucht Fahrzeuge
        private void BtnSuchen_Click(object sender, RoutedEventArgs e)
        {
            var suchbegriff = txtSuche.Text.Trim();
            if (string.IsNullOrWhiteSpace(suchbegriff))
                return;

            _fahrzeuge = _datenbankDienst.SucheFahrzeuge(suchbegriff);
            dgFahrzeuge.ItemsSource = _fahrzeuge;
            StatusAktualisieren();
        }

        // Zeigt alle Fahrzeuge
        private void BtnAlle_Click(object sender, RoutedEventArgs e)
        {
            txtSuche.Clear();
            FahrzeugeLaden();
        }

        // Reagiert auf Tabellen-Auswahl
        private void Liste_AuswahlGeaendert(object sender, SelectionChangedEventArgs e)
        {
            _ausgewaehltesFahrzeug = dgFahrzeuge.SelectedItem as Fahrzeug;

            if (_ausgewaehltesFahrzeug != null)
            {
                txtDetails.Text = $"Ausgewählt: {_ausgewaehltesFahrzeug.HoleBeschreibung()}";
                cmbMarke.SelectedItem = _ausgewaehltesFahrzeug.Marke;
                CmbMarke_AuswahlGeaendert(null, null);
                cmbModell.SelectedItem = _ausgewaehltesFahrzeug.Modell;
                txtBaujahr.Text = _ausgewaehltesFahrzeug.Baujahr.ToString();
                txtLeistung.Text = _ausgewaehltesFahrzeug.Leistung.ToString();
                txtKilometer.Text = _ausgewaehltesFahrzeug.Kilometerstand.ToString();
                txtKaufpreis.Text = _ausgewaehltesFahrzeug.Kaufpreis.ToString();
                txtFarbe.Text = _ausgewaehltesFahrzeug.Farbe;
                btnPdf.IsEnabled = true;
            }
            else
            {
                StatusAktualisieren();
                btnPdf.IsEnabled = false;
            }
        }

        // Exportiert Fahrzeug als PDF
        private void BtnPdf_Click(object sender, RoutedEventArgs e)
        {
            if (_ausgewaehltesFahrzeug == null)
                return;

            var dialog = new SaveFileDialog
            {
                Filter = "PDF-Dateien (*.pdf)|*.pdf",
                FileName = $"Fahrzeug_{_ausgewaehltesFahrzeug.Marke}_{_ausgewaehltesFahrzeug.Modell}_{DateTime.Now:yyyyMMdd_HHmmss}.pdf"
            };

            if (dialog.ShowDialog() == true)
            {
                if (_pdfDienst.ErstelleFahrzeugPdf(_ausgewaehltesFahrzeug, dialog.FileName))
                    MessageBox.Show("PDF erstellt.", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information);
            }
        }

        // Aktualisiert Liste
        private void BtnAktualisieren_Click(object sender, RoutedEventArgs e)
        {
            FahrzeugeLaden();
        }

        // Tastenkürzel
        protected override void OnKeyDown(System.Windows.Input.KeyEventArgs e)
        {
            if (e.Key == System.Windows.Input.Key.S && System.Windows.Input.Keyboard.Modifiers == System.Windows.Input.ModifierKeys.Control)
            {
                BtnHinzufuegen_Click(null, null);
                e.Handled = true;
            }
            else if (e.Key == System.Windows.Input.Key.F && System.Windows.Input.Keyboard.Modifiers == System.Windows.Input.ModifierKeys.Control)
            {
                txtSuche.Focus();
                e.Handled = true;
            }
            else if (e.Key == System.Windows.Input.Key.F5)
            {
                BtnAktualisieren_Click(null, null);
                e.Handled = true;
            }
            else if (e.Key == System.Windows.Input.Key.Escape)
            {
                EingabenLeeren();
                e.Handled = true;
            }

            base.OnKeyDown(e);
        }

        // Passt Modelle zur Marke an
        private void CmbMarke_AuswahlGeaendert(object sender, SelectionChangedEventArgs e)
        {
            if (cmbMarke.SelectedItem == null)
            {
                cmbModell.ItemsSource = null;
                return;
            }

            var marke = cmbMarke.SelectedItem.ToString();
            cmbModell.ItemsSource = _markenModelle[marke];
        }
    }
}
