"""
Base class for vein connectors.

Defines the minimal interface all veins should implement.
The core/ module contains isolated API clients.
The api/ module wraps them in FastAPI routes.
"""

from abc import ABC, abstractmethod
from typing import Generic, TypeVar

from fastapi import APIRouter

TCredentials = TypeVar("TCredentials")
TClient = TypeVar("TClient")


class BaseVein(ABC, Generic[TCredentials, TClient]):
    """
    Abstract base for vein connectors.

    Veins are wrappers around API clients that provide:
    - Standard auth patterns (headers or OAuth)
    - Health check endpoint
    - Consistent routing structure

    The core implementation should be isolated and runnable without FastAPI.
    """

    @property
    @abstractmethod
    def name(self) -> str:
        """Vein name (e.g., 'jira', 'slack', 'google')"""
        pass

    @abstractmethod
    def get_client(self, creds: TCredentials) -> TClient:
        """
        Create API client with given credentials.

        This should delegate to core/ module which contains
        the isolated client implementation.
        """
        pass

    @abstractmethod
    async def health_check(self, creds: TCredentials) -> dict:
        """
        Test connection and return status.

        Should return:
        {
            "status": "ok",
            "user": "...",  # or other identifying info
            ...
        }
        """
        pass

    def create_router(self) -> APIRouter:
        """
        Create base router with standard endpoints.

        Subclasses should extend this with additional routes.
        """
        router = APIRouter()
        return router
