// ==================== EMAIL PROVIDER TYPES ====================

// Verschlüsselungstyp für E-Mail-Verbindungen
export type MailEncryption = 'SSL' | 'STARTTLS' | 'NONE';

export interface EmailForwardTarget {
  email: string;
}

export interface CreateEmailParams {
  localPart: string;           // z.B. "max.mustermann"
  forwardTargets: string[];    // Weiterleitungsziele
}

export interface CreateEmailWithMailboxParams {
  localPart: string;           // z.B. "max.mustermann"
  forwardTargets: string[];    // Weiterleitungsziele
  password: string;            // Passwort für Mailbox (IMAP/SMTP)
}

export interface CreateEmailWithMailboxResult extends EmailOperationResult {
  // Erfolg: Mailbox-Informationen zurückgeben
  email?: string;              // Vollständige E-Mail-Adresse
}

export interface EnableMailboxParams {
  localPart: string;           // z.B. "max.mustermann"
  password: string;            // Passwort für Mailbox (IMAP/SMTP)
}

export interface UpdateMailboxPasswordParams {
  localPart: string;           // z.B. "max.mustermann"
  password: string;            // Neues Passwort für Mailbox
}

export interface RenameEmailParams {
  oldLocalPart: string;
  newLocalPart: string;
}

export interface EmailExistsResult {
  exists: boolean;
  email?: string;
  hasMailbox?: boolean;  // true wenn echte Mailbox vorhanden
  // Plesk hat zwei unabhängige Verteil-Mechanismen, beide können parallel
  // aktiv sein. Manuelle/Legacy-Anlagen nutzen oft "Mailgroup" statt
  // "Forwarding" – unser Sync muss alte Mitglieder dort einsammeln,
  // sonst gehen sie beim Umschalten auf Forwarding verloren.
  mailgroupActive?: boolean;
  mailgroupMembers?: string[];
  forwardingActive?: boolean;
  forwardingTargets?: string[];
}

export interface EmailOperationResult {
  success: boolean;
  message?: string;
  error?: string;
}

// Interface das alle Email-Provider implementieren müssen
export interface IEmailProvider {
  // Provider-Typ (z.B. 'PLESK', 'CPANEL')
  readonly type: string;

  // Testet die Verbindung zum Provider (wirft Fehler bei Fehlschlag)
  testConnection(): Promise<void>;

  // Prüft ob eine E-Mail-Adresse existiert
  emailExists(localPart: string): Promise<EmailExistsResult>;

  // Erstellt eine neue E-Mail-Weiterleitung (ohne Mailbox)
  createEmail(params: CreateEmailParams): Promise<EmailOperationResult>;

  // Erstellt eine neue E-Mail mit echter Mailbox (IMAP/SMTP-Zugang)
  createEmailWithMailbox(params: CreateEmailWithMailboxParams): Promise<CreateEmailWithMailboxResult>;

  // Aktiviert Mailbox für eine existierende E-Mail-Weiterleitung
  enableMailboxForExisting(params: EnableMailboxParams): Promise<EmailOperationResult>;

  // Aktualisiert das Passwort einer Mailbox
  updateMailboxPassword(params: UpdateMailboxPasswordParams): Promise<EmailOperationResult>;

  // Löscht eine E-Mail-Adresse
  deleteEmail(localPart: string): Promise<EmailOperationResult>;

  // Benennt eine E-Mail-Adresse um
  renameEmail(params: RenameEmailParams): Promise<EmailOperationResult>;

  // Aktualisiert die Weiterleitungsziele
  updateForwardTargets(localPart: string, targets: string[]): Promise<EmailOperationResult>;
}

// Konfiguration für Provider (aus DB)
export interface EmailProviderConfig {
  id: number;
  name: string;
  type: 'PLESK' | 'CPANEL' | 'DIRECTADMIN';
  apiUrl: string;
  apiKey?: string;
  username?: string;
  password?: string;  // Entschlüsselt
  domain: string;
  defaultForwardEmail?: string;
  // IMAP/SMTP-Server für E-Mail-Client (optional, default: mail.{domain})
  imapServer?: string;
  imapPort?: number;
  smtpServer?: string;
  smtpPort?: number;
  // Verschlüsselungs-Einstellungen
  imapEncryption?: MailEncryption;  // SSL, STARTTLS oder NONE
  smtpEncryption?: MailEncryption;  // SSL, STARTTLS oder NONE
  allowSelfSignedCerts?: boolean;   // Selbstsignierte Zertifikate erlauben
  isActive: boolean;
  isDefault: boolean;
}
