"""Phase 6.3 collaboration validators."""
from __future__ import annotations

from datetime import datetime

from shared.exceptions import AppError

from app.models.collaboration import SalesTimelineEvent
from app.models.types import ActivityStatus


def ensure_activity_completable(status: ActivityStatus) -> None:
    if status in {ActivityStatus.COMPLETED, ActivityStatus.CANCELLED}:
        raise AppError(
            "فعالیت قابل تکمیل نیست",
            status_code=409,
            error_code="activity_not_completable",
        )


def ensure_meeting_window(start_at: datetime, end_at: datetime) -> None:
    if end_at <= start_at:
        raise AppError(
            "زمان پایان باید بعد از شروع باشد",
            status_code=422,
            error_code="invalid_meeting_window",
        )


def ensure_call_has_opportunity_link(opportunity_id) -> None:
    if opportunity_id is None:
        raise AppError(
            "تماس باید به فرصت مرتبط باشد",
            status_code=422,
            error_code="call_opportunity_required",
        )


def ensure_timeline_immutable(event: SalesTimelineEvent) -> None:
    if event.is_immutable:
        raise AppError(
            "رویداد تایم‌لاین غیرقابل تغییر است",
            status_code=409,
            error_code="timeline_immutable",
        )


def validate_comment_body(body: str | None) -> str:
    if body is None or not str(body).strip():
        raise AppError(
            "متن نظر الزامی است",
            status_code=422,
            error_code="comment_body_required",
        )
    return str(body).strip()


def validate_duration_seconds(value: int) -> int:
    if value < 0:
        raise AppError(
            "مدت تماس نمی‌تواند منفی باشد",
            status_code=422,
            error_code="invalid_duration",
        )
    return value


def validate_bookmark_entity(entity_type: str) -> None:
    allowed = {"lead", "contact", "organization", "opportunity"}
    if entity_type not in allowed:
        raise AppError(
            "نوع موجودیت برای نشانک مجاز نیست",
            status_code=422,
            error_code="invalid_bookmark_entity",
        )
