using System;
using System.ComponentModel;

namespace FahrzeugVerwaltung
{
    public class Fahrzeug : INotifyPropertyChanged
    {
        private int _id;
        private string _marke;
        private string _modell;
        private int _baujahr;
        private int _leistung;
        private int _kilometerstand;
        private decimal _kaufpreis;
        private string _farbe;

        public int Id { get => _id; set { _id = value; MeldeEigenschaft(nameof(Id)); } }
        public string Marke { get => _marke; set { _marke = value; MeldeEigenschaft(nameof(Marke)); } }
        public string Modell { get => _modell; set { _modell = value; MeldeEigenschaft(nameof(Modell)); } }
        public int Baujahr { get => _baujahr; set { _baujahr = value; MeldeEigenschaft(nameof(Baujahr)); MeldeEigenschaft(nameof(AktuellerWert)); MeldeEigenschaft(nameof(AktuellerWertFormatiert)); } }
        public int Leistung { get => _leistung; set { _leistung = value; MeldeEigenschaft(nameof(Leistung)); } }
        public int Kilometerstand { get => _kilometerstand; set { _kilometerstand = value; MeldeEigenschaft(nameof(Kilometerstand)); MeldeEigenschaft(nameof(KilometerstandFormatiert)); MeldeEigenschaft(nameof(AktuellerWert)); MeldeEigenschaft(nameof(AktuellerWertFormatiert)); } }
        public decimal Kaufpreis { get => _kaufpreis; set { _kaufpreis = value; MeldeEigenschaft(nameof(Kaufpreis)); MeldeEigenschaft(nameof(KaufpreisFormatiert)); MeldeEigenschaft(nameof(AktuellerWert)); MeldeEigenschaft(nameof(AktuellerWertFormatiert)); } }
        public string Farbe { get => _farbe; set { _farbe = value; MeldeEigenschaft(nameof(Farbe)); } }

        public string KilometerstandFormatiert => $"{Kilometerstand:N0} km";
        public string KaufpreisFormatiert => $"{Kaufpreis:C}";
        public string AktuellerWertFormatiert => $"{AktuellerWert:C}";

        // Geschätzter aktueller Wert
        public decimal AktuellerWert => BerechneAktuellenWert();

        // Berechnet aktuellen Wert
        public decimal BerechneAktuellenWert()
        {
            if (Kaufpreis <= 0 || Baujahr <= 0) return 0;

            int alter = DateTime.Now.Year - Baujahr;
            decimal wertverlust = 0;

            for (int i = 0; i < alter; i++)
                wertverlust += (i < 3) ? 0.15m : 0.10m;

            wertverlust += (Kilometerstand / 10000m) * 0.02m;
            if (wertverlust > 0.90m) wertverlust = 0.90m;

            decimal wert = Kaufpreis * (1 - wertverlust);
            decimal mindestwert = Kaufpreis * 0.05m;
            if (wert < mindestwert) wert = mindestwert;

            return Math.Round(wert, 2);
        }

        // Beschreibung für Anzeige
        public string HoleBeschreibung()
        {
            return $"{Marke} {Modell} ({Baujahr}) - {Leistung} PS - {KilometerstandFormatiert} - {Farbe}";
        }

        // Alter des Fahrzeugs
        public int HoleAlter()
        {
            return DateTime.Now.Year - Baujahr;
        }

        // Prüft auf Oldtimer
        public bool IstOldtimer()
        {
            return HoleAlter() >= 30;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        // Meldet geänderte Eigenschaft
        private void MeldeEigenschaft(string eigenschaft)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(eigenschaft));
        }

        public override string ToString() => $"{Marke} {Modell} ({Baujahr})";
    }
}
