from abc import ABC, abstractmethod
from typing import List, Optional, Dict, Any
from pydantic import BaseModel

# --- Generisches Datenmodell ---
# Damit ist unsere App unabhängig davon, wie SuperOffice Felder benennt.
class LeadData(BaseModel):
    name: str
    website: Optional[str] = None
    city: Optional[str] = None
    country: str = "DE"
    industry: Optional[str] = None
    
    # Enrichment Data
    robotics_potential_score: int = 0
    robotics_potential_reason: Optional[str] = None
    
    # Meta
    source_id: Optional[str] = None # ID im Quellsystem (z.B. SuperOffice ID)

class TaskData(BaseModel):
    subject: str
    description: str
    deadline: Optional[str] = None

# --- Der Vertrag (Repository Interface) ---
class CRMRepository(ABC):
    """
    Abstrakte Basisklasse für alle CRM-Integrationen.
    Egal ob Notion, SuperOffice oder Odoo - alle müssen diese Methoden haben.
    """

    @abstractmethod
    def get_name(self) -> str:
        """Gibt den Namen des Systems zurück (z.B. 'SuperOffice')"""
        pass

    @abstractmethod
    def find_company(self, name: str, email: str = None) -> Optional[str]:
        """Sucht eine Firma und gibt die externe ID zurück, falls gefunden."""
        pass

    @abstractmethod
    def create_lead(self, lead: LeadData) -> str:
        """Erstellt einen neuen Lead und gibt die externe ID zurück."""
        pass

    @abstractmethod
    def update_lead(self, external_id: str, lead: LeadData) -> bool:
        """Aktualisiert einen bestehenden Lead mit neuen Enrichment-Daten."""
        pass

    @abstractmethod
    def create_task(self, external_id: str, task: TaskData) -> bool:
        """Erstellt eine Aufgabe/Wiedervorlage für den Vertriebler beim Lead."""
        pass
