# -*- coding: utf-8 -*- """ Abstrakte Basisklasse fuer Calendar Provider. Definiert die Schnittstelle die alle Provider implementieren muessen. """ from abc import ABC, abstractmethod from datetime import datetime from plugins.calendar.models import CalendarEvent class CalendarProvider(ABC): """ Abstrakte Basisklasse fuer Calendar Provider. Jeder Provider (Microsoft, Google, CalDAV) implementiert diese Schnittstelle. """ def __init__(self, name: str, config: dict) -> None: """ Initialisiert den Provider. Args: name: Provider-Schluessel aus Config (z.B. "outlook_firma") config: Provider-Konfiguration aus config.json """ self.name = name self.config = config self._connected = False @property def is_connected(self) -> bool: """Ist der Provider verbunden?""" return self._connected @abstractmethod async def connect(self) -> bool: """ Stellt die Verbindung zum Cloud-Dienst her. Returns: True bei erfolgreicher Verbindung """ ... @abstractmethod async def disconnect(self) -> None: """Trennt die Verbindung.""" ... @abstractmethod async def fetch_events( self, calendar_id: str, start: datetime, end: datetime, user: str = "", ) -> list[CalendarEvent]: """ Ruft Events aus einem Kalender ab. Args: calendar_id: Kalender-ID beim Provider start: Startzeitpunkt des Abfragefensters end: Endzeitpunkt des Abfragefensters user: Benutzer fuer die API-Abfrage (z.B. Email) Returns: Liste von CalendarEvent """ ... @abstractmethod async def create_event( self, calendar_id: str, title: str, start: datetime, end: datetime, user: str = "", location: str = "", description: str = "", attendees: list[str] | None = None, ) -> CalendarEvent | None: """ Erstellt einen neuen Termin. Args: calendar_id: Ziel-Kalender-ID title: Titel des Termins start: Startzeitpunkt end: Endzeitpunkt user: Benutzer fuer die API-Abfrage location: Ort description: Beschreibung attendees: Teilnehmer Returns: Erstelltes CalendarEvent oder None bei Fehler """ ... @abstractmethod async def health_check(self) -> bool: """ Prueft ob die Verbindung aktiv und funktionsfaehig ist. Returns: True wenn Provider erreichbar ist """ ...