/** Geteilte Typen zwischen Server und Client. */

/**
 * Bezugsquelle, aus der die Datei einer Software geholt und aktuell gehalten wird.
 * `manuell` bedeutet: die Datei wird von Hand hochgeladen und nicht automatisch aktualisiert.
 */
export type QuelleTyp = 'direkt' | 'github' | 'winget' | 'svn' | 'git' | 'manuell';

/** Einstufung einer Software — gliedert den Katalog und steuert die Hinweise. */
export type Einstufung = 'lizenzfrei' | 'lizenzpflichtig' | 'intern';

/** Alle Einstufungen mit Anzeigetext, in der Reihenfolge der Katalog-Reiter. */
export const EINSTUFUNGEN: Array<{ id: Einstufung; text: string }> = [
  { id: 'lizenzfrei', text: 'Lizenzfrei' },
  { id: 'lizenzpflichtig', text: 'Lizenzpflichtig' },
  { id: 'intern', text: 'Intern' },
];

/**
 * Wie das Programm auf den Rechner kommt. `unbestimmt` ist der Ausgangswert —
 * ein Eintrag muss nicht sofort eingeordnet werden.
 */
export type Programmart = 'unbestimmt' | 'installer' | 'eigenstaendig';

/** Alle Programmarten mit Anzeigetext, in der Reihenfolge des Auswahlfelds. */
export const PROGRAMMARTEN: Array<{ id: Programmart; text: string }> = [
  { id: 'unbestimmt', text: 'Unbestimmt' },
  { id: 'installer', text: 'Installationsprogramm' },
  { id: 'eigenstaendig', text: 'Eigenständiges Programm' },
];

/** Ein Bau-Geheimnis, das ein Repository für seinen Bau anfordert. */
export interface GeheimnisBedarf {
  /** Name der Umgebungsvariablen, z. B. `ANTHROPIC_API_KEY`. */
  name: string;
  beschreibung: string;
}

/** Stand eines Bau-Geheimnisses in der Oberfläche — nie der Wert selbst. */
export interface GeheimnisUebersicht {
  name: string;
  hinterlegt: boolean;
  zeichen: number;
}

/** Ein Software-Eintrag im Katalog. */
export interface Software {
  id: number;
  name: string;
  beschreibung: string;
  /** Id der übergeordneten Software, falls dieser Eintrag ein Zusatzinhalt dazu ist (0 = eigenständiges Tool). */
  elternId: number;
  /** Typ der Bezugsquelle (leer, falls noch keine gesetzt). */
  quelleTyp: QuelleTyp | '';
  /** Quell-spezifische Angabe: URL (direkt), `besitzer/repo` (github), Paket-ID (winget), Repo-URL (svn/git). Bei `manuell` leer. */
  quelleWert: string;
  /** Nur bei Quelle `git`: Befehl, der das Tool baut (im Wurzelverzeichnis der Arbeitskopie ausgeführt). */
  bauBefehl: string;
  /** Nur bei Quelle `git`: Pfad des Bau-Ergebnisses relativ zur Arbeitskopie, `*` im Dateinamen erlaubt. */
  bauErgebnis: string;
  /** Einstufung: lizenzfrei, lizenzpflichtig (Schlüssel über den Support) oder intern (Eigenentwicklung). */
  einstufung: Einstufung;
  /** Installationsprogramm oder eigenständige Datei — bestimmt den Hinweis am Eintrag. */
  programmart: Programmart;
  /** Freier Hinweis am Eintrag, z. B. „braucht Adminrechte". Leer = keiner. */
  hinweis: string;
  /** Link zur Anleitung (WikiJS intern oder extern), leer falls keine hinterlegt. */
  anleitungUrl: string;
  /** Aktuelle Versions-/Stand-Kennung, vom Abgleich gesetzt (Release-Tag, ETag, winget-Version, SVN-Revision). */
  version: string;
  /** Aktuell bereitgestellte Datei im Ablageordner (leer, solange noch nichts vorliegt). */
  dateiname: string;
  /** Zeitpunkt, zu dem die bereitgestellte Datei zuletzt tatsächlich erneuert wurde (unser Abruf). */
  dateiStandVom: string;
  /** Veröffentlichungsdatum beim Anbieter, sofern die Quelle es mitliefert. */
  veroeffentlichtAm: string;
  /** Windows-Signaturstatus der bereitgestellten Datei (Valid, NotSigned, …). */
  signaturStatus: string;
  /** Signaturgeber der bereitgestellten Datei (leer, wenn unsigniert). */
  signaturHerausgeber: string;
  /** Optional: erwarteter Signaturgeber. Weicht er ab, wird die Datei nicht bereitgestellt. */
  erwarteterHerausgeber: string;
  /** Vom Repository angeforderte Bau-Geheimnisse (aus `software-bibliothek.json`). */
  benoetigteGeheimnisse: GeheimnisBedarf[];
  /** Zeitpunkt des letzten Abgleichs (leer, falls nie geprüft). */
  letzterAbgleich: string;
  /** War der letzte Abgleich erfolgreich? */
  abgleichErfolg: boolean;
  /** Meldung des letzten Abgleichs (z.B. „Aktualisiert." oder ein Fehlertext). */
  abgleichMeldung: string;
  erstelltAm: string;
  aktualisiertAm: string;
}

/** Nutzlast beim Anlegen/Bearbeiten (server-verwaltete Felder wie Version/Datei/Abgleich ausgenommen). */
export interface SoftwareEingabe {
  name: string;
  beschreibung: string;
  elternId: number;
  quelleTyp: QuelleTyp | '';
  quelleWert: string;
  bauBefehl: string;
  bauErgebnis: string;
  einstufung: Einstufung;
  programmart: Programmart;
  hinweis: string;
  anleitungUrl: string;
  erwarteterHerausgeber: string;
}

/** Ergebnis eines Bezugsquellen-Abgleichs, das in die DB zurückgeschrieben wird. */
export interface AbgleichErgebnis {
  version: string;
  dateiname: string;
  erfolg: boolean;
  meldung: string;
  /** Wurde tatsächlich eine neue Datei bereitgestellt? Nur dann zählt es als Update. */
  geaendert: boolean;
  signaturStatus: string;
  signaturHerausgeber: string;
  veroeffentlichtAm: string;
  benoetigteGeheimnisse: GeheimnisBedarf[];
}

/** Einstellungen der Anwendung (Datei `konfiguration.json` neben der Anwendung). */
export interface Einstellungen {
  /** Ablageort für Datenbank und Programm-Dateien. Leer = Ordner „data" neben der Anwendung. */
  datenOrdner: string;
  /** Port, auf dem die Oberfläche erreichbar ist. */
  port: number;
  /**
   * Kennung für Git-Zugriffe über SSH. Leer = die SSH-Konfiguration des
   * Dienstbenutzers entscheidet. Hier zentral gepflegt, damit ein Kontowechsel
   * keine Anpassung an den Katalogeinträgen erfordert.
   */
  gitBenutzer: string;
  /** Optionaler Pfad zum privaten SSH-Schlüssel für Git-Zugriffe. */
  gitSchluessel: string;
}

/** Einstellungen samt der daraus abgeleiteten, tatsächlich genutzten Pfade. */
export interface EinstellungenAnsicht {
  einstellungen: Einstellungen;
  /** Vollständiger Pfad der Konfigurationsdatei. */
  konfigurationsDatei: string;
  /** Tatsächlich verwendeter Datenordner (aufgelöst aus der Einstellung). */
  effektiverDatenOrdner: string;
  /** Läuft gerade auf diesem Port (Änderungen wirken erst nach Neustart). */
  laufenderPort: number;
}

/** Ein protokollierter Zugriff/Download aus dem Netzwerk. */
export interface ZugriffslogEintrag {
  id: number;
  zeitpunkt: string;
  ipAdresse: string;
  rechnername: string;
  angegebenerName: string;
  aktion: string;
}
