"""String enums shared by models, schemas and services."""

from __future__ import annotations

from enum import StrEnum


class CampaignStatus(StrEnum):
    DRAFT = "draft"
    ACTIVE = "active"
    PAUSED = "paused"
    COMPLETED = "completed"


class LeadStatus(StrEnum):
    COLD = "cold"
    WARM = "warm"
    QUALIFIED = "qualified"
    HOT = "hot"
    REJECTED = "rejected"


class ConnectionStatus(StrEnum):
    NOT_CONNECTED = "not_connected"
    PENDING = "connection_pending"
    CONNECTED = "connected"
    NOT_INTERESTED = "not_interested"
    UNKNOWN = "unknown"


class MessageStatus(StrEnum):
    NOT_SENT = "not_sent"
    QUEUED = "queued"
    SENT = "sent"
    REPLIED = "replied"


class ReplyStatus(StrEnum):
    NO_REPLY = "no_reply"
    REPLIED = "replied"
    POSITIVE = "positive"
    NEGATIVE = "negative"
    INTERESTED = "interested"
    MEETING_REQUESTED = "meeting_requested"
    NOT_INTERESTED = "not_interested"


#: Reply outcomes that count as a positive signal in analytics.
POSITIVE_REPLIES = {
    ReplyStatus.POSITIVE,
    ReplyStatus.INTERESTED,
    ReplyStatus.MEETING_REQUESTED,
}


class TaskType(StrEnum):
    REVIEW_CONNECTION = "review_connection"
    CONNECTION_REQUEST = "connection_request"
    FIRST_MESSAGE = "first_message"
    FOLLOW_UP_1 = "follow_up_1"
    FOLLOW_UP_2 = "follow_up_2"
    FOLLOW_UP_3 = "follow_up_3"


FOLLOW_UP_TYPES = [TaskType.FOLLOW_UP_1, TaskType.FOLLOW_UP_2, TaskType.FOLLOW_UP_3]


class TaskStatus(StrEnum):
    PENDING = "pending"
    APPROVED = "approved"
    COMPLETED = "completed"
    SKIPPED = "skipped"
    REJECTED = "rejected"
    FAILED = "failed"
    STOPPED = "stopped"


#: Task statuses that are still actionable and should be cancelled when a reply lands.
OPEN_TASK_STATUSES = {TaskStatus.PENDING, TaskStatus.APPROVED}


class RuleOperator(StrEnum):
    CONTAINS = "contains"
    NOT_CONTAINS = "not_contains"
    EQUALS = "equals"
    NOT_EQUALS = "not_equals"
    STARTS_WITH = "starts_with"
    ENDS_WITH = "ends_with"
    REGEX = "regex"
    GREATER_THAN = "greater_than"
    LESS_THAN = "less_than"
    BETWEEN = "between"
    IS_EMPTY = "is_empty"
    IS_NOT_EMPTY = "is_not_empty"


class RuleAction(StrEnum):
    SCORE = "score"
    REJECT = "reject"
    TAG = "tag"
    SELECT_TEMPLATE = "select_template"
    ADD_PHRASE = "add_phrase"


class RuleMatchType(StrEnum):
    ALL = "all"
    ANY = "any"


class ActivityType(StrEnum):
    LEAD_CREATED = "lead_created"
    LEAD_UPDATED = "lead_updated"
    LEAD_SCORED = "lead_scored"
    TASK_CREATED = "task_created"
    TASK_APPROVED = "task_approved"
    TASK_COMPLETED = "task_completed"
    TASK_SKIPPED = "task_skipped"
    TASK_REJECTED = "task_rejected"
    TASK_STOPPED = "task_stopped"
    MESSAGE_GENERATED = "message_generated"
    CONNECTION_STATUS_CHANGED = "connection_status_changed"
    REPLY_RECEIVED = "reply_received"
    NOTE = "note"
