# app/modules/monitoring/exceptions.py
"""
Monitoring module exceptions.

This module provides exception classes for monitoring operations including:
- Background task tracking
- Capacity snapshot management
- Code quality/architecture scans
"""

from app.exceptions.base import (
    BusinessLogicException,
    ExternalServiceException,
    ResourceNotFoundException,
    ValidationException,
)

__all__ = [
    # Task exceptions
    "TaskNotFoundException",
    # Capacity exceptions
    "CapacitySnapshotNotFoundException",
    # General monitoring exceptions
    "MonitoringServiceException",
    # Code quality exceptions
    "ViolationNotFoundException",
    "ScanNotFoundException",
    "ScanExecutionException",
    "ScanTimeoutException",
    "ScanParseException",
    "ViolationOperationException",
    "InvalidViolationStatusException",
]


# =============================================================================
# Task Exceptions
# =============================================================================


class TaskNotFoundException(ResourceNotFoundException):  # noqa: MOD025
    """Raised when a background task is not found."""

    def __init__(self, task_id: str):
        super().__init__(
            resource_type="BackgroundTask",
            identifier=task_id,
            error_code="TASK_NOT_FOUND",
        )


# =============================================================================
# Capacity Exceptions
# =============================================================================


class CapacitySnapshotNotFoundException(ResourceNotFoundException):  # noqa: MOD025
    """Raised when a capacity snapshot is not found."""

    def __init__(self, snapshot_id: int):
        super().__init__(
            resource_type="CapacitySnapshot",
            identifier=str(snapshot_id),
            error_code="CAPACITY_SNAPSHOT_NOT_FOUND",
        )


# =============================================================================
# General Monitoring Exceptions
# =============================================================================


class MonitoringServiceException(BusinessLogicException):  # noqa: MOD025
    """Raised when a monitoring operation fails."""

    def __init__(self, operation: str, reason: str):
        super().__init__(
            message=f"Monitoring operation '{operation}' failed: {reason}",
            error_code="MONITORING_OPERATION_FAILED",
            details={"operation": operation, "reason": reason},
        )


# =============================================================================
# Code Quality Exceptions
# =============================================================================


class ViolationNotFoundException(ResourceNotFoundException):
    """Raised when a violation is not found."""

    def __init__(self, violation_id: int):
        super().__init__(
            resource_type="Violation",
            identifier=str(violation_id),
            error_code="VIOLATION_NOT_FOUND",
        )


class ScanNotFoundException(ResourceNotFoundException):
    """Raised when a scan is not found."""

    def __init__(self, scan_id: int):
        super().__init__(
            resource_type="Scan",
            identifier=str(scan_id),
            error_code="SCAN_NOT_FOUND",
        )


class ScanExecutionException(ExternalServiceException):  # noqa: MOD025
    """Raised when architecture scan execution fails."""

    def __init__(self, reason: str):
        super().__init__(
            service_name="ArchitectureValidator",
            message=f"Scan execution failed: {reason}",
            error_code="SCAN_EXECUTION_FAILED",
        )


class ScanTimeoutException(ExternalServiceException):
    """Raised when architecture scan times out."""

    def __init__(self, timeout_seconds: int = 300):
        super().__init__(
            service_name="ArchitectureValidator",
            message=f"Scan timed out after {timeout_seconds} seconds",
            error_code="SCAN_TIMEOUT",
            details={"timeout_seconds": timeout_seconds},
        )


class ScanParseException(BusinessLogicException):
    """Raised when scan results cannot be parsed."""

    def __init__(self, reason: str):
        super().__init__(
            message=f"Failed to parse scan results: {reason}",
            error_code="SCAN_PARSE_FAILED",
            details={"reason": reason},
        )


class ViolationOperationException(BusinessLogicException):  # noqa: MOD025
    """Raised when a violation operation fails."""

    def __init__(self, operation: str, violation_id: int, reason: str):
        super().__init__(
            message=f"Failed to {operation} violation {violation_id}: {reason}",
            error_code="VIOLATION_OPERATION_FAILED",
            details={
                "operation": operation,
                "violation_id": violation_id,
                "reason": reason,
            },
        )


class InvalidViolationStatusException(ValidationException):  # noqa: MOD025
    """Raised when a violation status transition is invalid."""

    def __init__(self, violation_id: int, current_status: str, target_status: str):
        super().__init__(
            message=f"Cannot change violation {violation_id} from '{current_status}' to '{target_status}'",
            field="status",
            details={
                "violation_id": violation_id,
                "current_status": current_status,
                "target_status": target_status,
            },
        )
        self.error_code = "INVALID_VIOLATION_STATUS"
