namespace Flaro.Core.Library;
/// Woran ein Lauf gerade ist.
public enum Scanphase
{
/// Das Dateisystem wird durchgegangen.
Suchen,
/// Eine Datei wird gelesen und vermessen.
Pruefen,
/// Ein Titel wird bei der Metadatenquelle gesucht.
Nachschlagen,
/// Die Angaben zu einem gefundenen Titel werden geholt.
Holen,
/// Plakate und Hintergründe werden geladen.
Bilder,
/// Verwaistes wird entfernt, Doppeltes zusammengelegt.
Aufraeumen,
}
/// Ein Zwischenstand: was gerade passiert, und wie weit.
///
///
///
/// Mit Namen, nicht nur mit Zahlen. Vorher stand in der Verwaltung
/// minutenlang „Wird durchsucht…" — ohne Hinweis, ob überhaupt etwas
/// passiert. Wer bei vierzigtausend Dateien zusieht, braucht zu sehen, dass
/// sich etwas bewegt, und woran es gerade hängt, wenn es hängt.
///
///
/// Ein record struct, weil davon im Sekundentakt viele entstehen und
/// keiner davon überlebt.
///
///
/// Welcher Abschnitt des Laufs.
/// Woran genau — ein Titel oder ein Pfad.
/// Wie viele Stücke schon durch sind.
/// Wie viele es insgesamt sind; 0, wenn unbekannt.
public readonly record struct Scanschritt(Scanphase Phase, string Was, int Erledigt = 0, int Gesamt = 0)
{
/// Der Satz, der in der Oberfläche steht.
///
///
/// Hier und nicht in der Oberfläche. Die Apps brauchen denselben
/// Satz, und zweimal formuliert driftet er auseinander.
///
public string Text()
{
var zaehler = Gesamt > 0 ? $" — {Erledigt} von {Gesamt}" : "";
return Phase switch
{
Scanphase.Suchen => $"Suche Medien in {Kurz(Was)}",
Scanphase.Pruefen => $"Prüfe {Kurz(Was)}{zaehler}",
Scanphase.Nachschlagen => $"Suche „{Was}“ bei der Metadatenquelle{zaehler}",
Scanphase.Holen => $"Hole Metadaten zu {Was}{zaehler}",
Scanphase.Bilder => $"Lade Bilder zu {Was}{zaehler}",
Scanphase.Aufraeumen => "Räume auf und lege Doppeltes zusammen",
_ => Was,
};
}
/// Die letzten zwei Pfadbestandteile — ein ganzer Pfad sprengt die Zeile.
private static string Kurz(string pfad)
{
if (string.IsNullOrEmpty(pfad)) return pfad;
var teile = pfad.Split('/', StringSplitOptions.RemoveEmptyEntries);
return teile.Length <= 2 ? pfad : string.Join('/', teile[^2..]);
}
}