"""
Abstract base class for issue management backends.

This module defines the interface that all issue management backends must implement.
"""

from abc import ABC, abstractmethod
from typing import List, Optional, Dict, Any
import sys
from pathlib import Path
# Add project root to path so domain module can be imported
project_root = Path(__file__).parent.parent.parent
if str(project_root) not in sys.path:
    sys.path.insert(0, str(project_root))

from domain.issues.models import Issue


class IssueBackend(ABC):
    """Abstract base class for issue management backends."""

    def __init__(self, config: Dict[str, Any]):
        """Initialize backend with configuration."""
        self.config = config

    @abstractmethod
    def list_issues(self, state: Optional[str] = None) -> List[Issue]:
        """
        List issues with optional state filter.

        Args:
            state: Filter by state ('open', 'closed', 'all', or None for all)

        Returns:
            List of Issue objects
        """
        pass

    @abstractmethod
    def get_issue(self, issue_id: str) -> Issue:
        """
        Get specific issue by ID.

        Args:
            issue_id: The issue identifier

        Returns:
            Issue object

        Raises:
            Exception: If issue not found
        """
        pass

    @abstractmethod
    def create_issue(self, title: str, body: str, **kwargs) -> Issue:
        """
        Create new issue.

        Args:
            title: Issue title
            body: Issue body/description
            **kwargs: Additional issue properties (labels, assignees, etc.)

        Returns:
            Created Issue object
        """
        pass

    @abstractmethod
    def add_comment(self, issue_id: str, comment: str) -> Dict[str, Any]:
        """
        Add comment to issue.

        Args:
            issue_id: The issue identifier
            comment: Comment text

        Returns:
            Comment metadata (id, timestamp, etc.)
        """
        pass

    @abstractmethod
    def close_issue(self, issue_id: str) -> Issue:
        """
        Close issue.

        Args:
            issue_id: The issue identifier

        Returns:
            Updated Issue object with closed state
        """
        pass

    @abstractmethod
    def update_issue(self, issue_id: str, **kwargs) -> Issue:
        """
        Update issue properties.

        Args:
            issue_id: The issue identifier
            **kwargs: Properties to update (title, body, state, etc.)

        Returns:
            Updated Issue object
        """
        pass