"""
PM Module — Domain Exceptions

استثناهای حوزه مدیریت پروژه.
"""


class PMDomainException(Exception):
    """Base exception for PM module."""
    pass


class ProjectNotFoundException(PMDomainException):
    """پروژه یافت نشد."""
    def __init__(self, project_id=None):
        msg = f"پروژه یافت نشد: {project_id}" if project_id else "پروژه یافت نشد"
        super().__init__(msg)


class TaskNotFoundException(PMDomainException):
    """تسک یافت نشد."""
    def __init__(self, task_id=None):
        msg = f"تسک یافت نشد: {task_id}" if task_id else "تسک یافت نشد"
        super().__init__(msg)


class InvalidStatusTransitionException(PMDomainException):
    """تغییر وضعیت نامعتبر."""
    def __init__(self, current_status, target_status, entity_type=""):
        msg = f"تغییر وضعیت {entity_type} از {current_status} به {target_status} مجاز نیست"
        super().__init__(msg)


class CircularDependencyException(PMDomainException):
    """وابستگی حلقوی."""
    def __init__(self):
        super().__init__("وابستگی حلقوی شناسایی شد")


class ResourceOverallocationException(PMDomainException):
    """تخصیص بیش از ظرفیت منبع."""
    def __init__(self, resource_name=""):
        msg = f"منبع {resource_name} بیش از ظرفیت تخصیص داده شده" if resource_name else "تخصیص بیش از ظرفیت"
        super().__init__(msg)


class BudgetExceededException(PMDomainException):
    """تجاوز از بودجه."""
    def __init__(self, budget_name=""):
        msg = f"بودجه {budget_name} تجاوز شده" if budget_name else "بودجه تجاوز شده"
        super().__init__(msg)


class BaselineActiveException(PMDomainException):
    """خط پایه فعال از قبل وجود دارد."""
    def __init__(self):
        super().__init__("خط پایه فعال از قبل وجود دارد — ابتدا غیرفعال کنید")


class DuplicateCodeException(PMDomainException):
    """کد تکراری."""
    def __init__(self, code="", entity_type=""):
        msg = f"کد {code} برای {entity_type} تکراری است" if code else "کد تکراری"
        super().__init__(msg)


class ChangeRequestNotApprovedException(PMDomainException):
    """درخواست تغییر تأیید نشده."""
    def __init__(self):
        super().__init__("درخواست تغییر تأیید نشده — نمی‌توان اعمال کرد")


class DependencyNotSatisfiedException(PMDomainException):
    """وابستگی تسک برآورده نشده — تسک پیش‌نیاز تکمیل نشده."""
    def __init__(self, predecessor_title=""):
        if predecessor_title:
            msg = f"تسک پیش‌نیاز «{predecessor_title}» هنوز تکمیل نشده است"
        else:
            msg = "تسک پیش‌نیاز تکمیل نشده است"
        super().__init__(msg)


class TaskHasDependentsException(PMDomainException):
    """تسک وابستگی دارد و قابل حذف نیست."""
    def __init__(self, task_title=""):
        if task_title:
            msg = f"تسک «{task_title}» به عنوان پیش‌نیاز تسک‌های دیگر استفاده شده است"
        else:
            msg = "این تسک به عنوان پیش‌نیاز تسک‌های دیگر استفاده شده است"
        super().__init__(msg)


# ═══════════════════════════════════════════════════
# Backward-compatible aliases (Error suffix)
# ═══════════════════════════════════════════════════

ProjectNotFoundError = ProjectNotFoundException
TaskNotFoundError = TaskNotFoundException
InvalidStatusTransitionError = InvalidStatusTransitionException
CircularDependencyError = CircularDependencyException
ResourceOverallocationError = ResourceOverallocationException
BudgetExceededError = BudgetExceededException
DuplicateCodeError = DuplicateCodeException
DependencyNotSatisfiedError = DependencyNotSatisfiedException
TaskHasDependentsError = TaskHasDependentsException
