"""Abstract base class for PSA provider implementations.""" from __future__ import annotations from abc import ABC, abstractmethod from .types import ( ConnectionTestResult, PSATicket, PSANote, PSAStatus, PSACompany, PSAMember, PSAConfiguration, PSATimeEntry, PSABoard, PaginatedTicketResult, PSAResource, PSACreatedTicket, TicketCreatePayload, ) class PSAProvider(ABC): """Abstract base for PSA integrations (ConnectWise, Autotask, etc.).""" @abstractmethod async def test_connection(self) -> ConnectionTestResult: ... @abstractmethod async def get_ticket(self, ticket_id: str) -> PSATicket: ... @abstractmethod async def search_tickets(self, query: str, **filters) -> PaginatedTicketResult: ... @abstractmethod async def post_note( self, ticket_id: str, text: str, note_type: str, member_id: str | None = None, ) -> PSANote: ... @abstractmethod async def update_ticket_status( self, ticket_id: str, status_id: int, ) -> PSATicket: ... @abstractmethod async def get_ticket_statuses(self, board_id: int) -> list[PSAStatus]: ... @abstractmethod async def list_companies(self, **filters) -> list[PSACompany]: ... @abstractmethod async def get_company(self, company_id: str) -> PSACompany: ... @abstractmethod async def list_members(self) -> list[PSAMember]: ... @abstractmethod async def list_boards(self) -> list[PSABoard]: ... @abstractmethod async def get_ticket_configurations(self, ticket_id: str) -> list[PSAConfiguration]: ... @abstractmethod async def create_time_entry( self, ticket_id: str, member_id: str, hours: float, notes: str | None = None, work_type: str | None = None, ) -> PSATimeEntry: ... @abstractmethod async def list_resources(self, ticket_id: int) -> list[PSAResource]: ... @abstractmethod async def add_resource(self, ticket_id: int, member_id: int) -> PSAResource: ... @abstractmethod async def remove_resource(self, ticket_id: int, member_id: int) -> None: ... @abstractmethod async def create_ticket(self, payload: TicketCreatePayload) -> PSACreatedTicket: ... @abstractmethod async def list_priorities(self) -> list[dict]: ...