# app/exceptions/company.py
"""
Company management specific exceptions.
"""

from typing import Any

from .base import (
    AuthorizationException,
    BusinessLogicException,
    ConflictException,
    ResourceNotFoundException,
    ValidationException,
)


class CompanyNotFoundException(ResourceNotFoundException):
    """Raised when a company is not found."""

    def __init__(self, company_identifier: str | int, identifier_type: str = "id"):
        if identifier_type.lower() == "id":
            message = f"Company with ID '{company_identifier}' not found"
        else:
            message = f"Company with name '{company_identifier}' not found"

        super().__init__(
            resource_type="Company",
            identifier=str(company_identifier),
            message=message,
            error_code="COMPANY_NOT_FOUND",
        )


class CompanyAlreadyExistsException(ConflictException):
    """Raised when trying to create a company that already exists."""

    def __init__(self, company_name: str):
        super().__init__(
            message=f"Company with name '{company_name}' already exists",
            error_code="COMPANY_ALREADY_EXISTS",
            details={"company_name": company_name},
        )


class CompanyNotActiveException(BusinessLogicException):
    """Raised when trying to perform operations on inactive company."""

    def __init__(self, company_id: int):
        super().__init__(
            message=f"Company with ID '{company_id}' is not active",
            error_code="COMPANY_NOT_ACTIVE",
            details={"company_id": company_id},
        )


class CompanyNotVerifiedException(BusinessLogicException):
    """Raised when trying to perform operations requiring verified company."""

    def __init__(self, company_id: int):
        super().__init__(
            message=f"Company with ID '{company_id}' is not verified",
            error_code="COMPANY_NOT_VERIFIED",
            details={"company_id": company_id},
        )


class UnauthorizedCompanyAccessException(AuthorizationException):
    """Raised when user tries to access company they don't own."""

    def __init__(self, company_id: int, user_id: int | None = None):
        details = {"company_id": company_id}
        if user_id:
            details["user_id"] = user_id

        super().__init__(
            message=f"Unauthorized access to company with ID '{company_id}'",
            error_code="UNAUTHORIZED_COMPANY_ACCESS",
            details=details,
        )


class InvalidCompanyDataException(ValidationException):
    """Raised when company data is invalid or incomplete."""

    def __init__(
        self,
        message: str = "Invalid company data",
        field: str | None = None,
        details: dict[str, Any] | None = None,
    ):
        super().__init__(
            message=message,
            field=field,
            details=details,
        )
        self.error_code = "INVALID_COMPANY_DATA"


class CompanyValidationException(ValidationException):
    """Raised when company validation fails."""

    def __init__(
        self,
        message: str = "Company validation failed",
        field: str | None = None,
        validation_errors: dict[str, str] | None = None,
    ):
        details = {}
        if validation_errors:
            details["validation_errors"] = validation_errors

        super().__init__(
            message=message,
            field=field,
            details=details,
        )
        self.error_code = "COMPANY_VALIDATION_FAILED"


class CompanyHasVendorsException(BusinessLogicException):
    """Raised when trying to delete a company that still has active vendors."""

    def __init__(self, company_id: int, vendor_count: int):
        super().__init__(
            message=f"Cannot delete company with ID '{company_id}' because it has {vendor_count} associated vendor(s)",
            error_code="COMPANY_HAS_VENDORS",
            details={"company_id": company_id, "vendor_count": vendor_count},
        )
