// ----------------------------------------------------------------------------
// 1. BEISPIEL: ICEBREAKER & SYSTEM-HACKS (FUNC & ACTION)
// ----------------------------------------------------------------------------
// Kontext:
// Ein Netrunner dringt in gesicherte Megacorp-Server ein. Um Schutzprogramme
// (ICE - Intrusion Countermeasure Electronics) zu ueberwinden, fuehrt das
// Cyberdeck dynamische Hacking-Routinen aus.
// Anstatt fuer jede Operation ein eigenes delegate zu deklarieren, soll das
// Cyberdeck die vordefinierten generischen Delegatetypen Func<...> fuer
// Berechnungen und Action<...> fuer Status- und Alertmeldungen verwenden.
 
// 1.1) Aufgabenstellung IceBreaker:
//
// Verwenden Sie fuer Berechnungsroutinen den vordefinierten generischen
// Typ Func<IceBreaker, int, int>. Die Funktion nimmt einen IceBreaker
// sowie einen int-Wert (firewallDefense bzw. securityTier) entgegen und
// liefert einen Durchdringungswert (int) zurueck.
 
public class IceBreaker {
    public string ToolName { get; init; } = string.Empty;
    public int BasePenetration { get; init; }
    public int MemoryCost { get; init; }
    public int[] IceProfiles { get; } = new int[3];
}
 
public class CyberDeckDevice {
    public int AvailableMemory { get; set; } = 16;
    public int SecurityAlertLevel { get; set; } = 0;
}
 
 
 
// 1.1a) Implementieren Sie eine Klasse HackSimulator mit folgenden Methoden:
 
// Verwenden Sie für BreachAngriffe den Typ Func<IceBreaker, int, int>
 
// Verwenden Sie fuer Alarmierungen den Typ Action<string, int>, welcher
// den Systemnamen (string) und das Trace-Level (int) verarbeitet.
 
public class HackSimulator {
//       1. Methode TestBreach(IceBreaker tool, int firewallDefense):
//          Dient Testlaeufen im Simulator. Unabhaengig vom Tool und der
//          Firewall liefert die Methode immer genau den Testwert 100 zurueck.
//
//       2. Methode OverclockedBreach(IceBreaker tool, int firewallDefense):
//          Berechnet die Durchdringung: Verdoppeln Sie tool.BasePenetration
//          und ziehen Sie firewallDefense ab. Ist das Ergebnis groesser als 0,
//          wird dieser Wert zurueckgegeben, andernfalls 0.
//
//       3. Methode ProfileBreach(IceBreaker tool, int securityTier):
//          Ermittelt anhand der Sicherheitsstufe (securityTier von 1 bis 12)
//          den Profil-Index:
//          - 0 < securityTier <= 4  => Index 0
//          - 4 < securityTier <= 8  => Index 1
//          - 8 < securityTier <= 12 => Index 2
//          Liegt der securityTier ausserhalb von 1 bis 12, wird 0 geliefert.
//          Multiplizieren Sie tool.IceProfiles[index] mit tool.BasePenetration
//          und geben Sie das Ergebnis zurueck.
//
//
//       4. Methode AlertSecurity(string systemName, int threatLevel):
//          Gibt auf der Konsole folgenden Text aus:
//          [TRACE ALERT] System: {systemName} | Threat Level: {threatLevel}
}
 
 
 
 
 
 
 
// 1.1c) Ergaenzen Sie die gegebene Klasse IceBreaker um folgende Properties:
//       - BreachRoutine { get; set; }: Speichern von Methoden vom Typ Func<IceBreaker, int, int>
//       -  OnSecurityAlert { get; set; }: Speichern von Methoden vom Typ Action<string, int>
 
 
 
 
// 1.1d) Schreiben Sie im Projekt CyberDeckTest eine Testklasse IceBreakerTests:
//       - Instanziieren Sie einen IceBreaker.
//       - Testen Sie TestBreach, OverclockedBreach und ProfileBreach durch
//         Zuweisung an die Property BreachRoutine.
//       - Pruefen Sie die Berechnungen mit Assert.That(...).
//       - Testen Sie die Ausfuehrung von OnSecurityAlert (auch als Multicast +=).