# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

from typing import List, Union, Optional
from datetime import datetime
from typing_extensions import Literal, TypeAlias

from .pattern import Pattern
from ....._models import BaseModel

__all__ = [
    "PredefinedProfile",
    "Entry",
    "EntryCustomEntry",
    "EntryPredefinedEntry",
    "EntryPredefinedEntryConfidence",
    "EntryPredefinedEntryVariant",
    "EntryPredefinedEntryVariantUnionMember0",
    "EntryPredefinedEntryVariantUnionMember1",
    "EntryIntegrationEntry",
    "EntryExactDataEntry",
    "EntryDocumentFingerprintEntry",
    "EntryWordListEntry",
]


class EntryCustomEntry(BaseModel):
    id: str

    created_at: datetime

    enabled: bool

    name: str

    pattern: Pattern

    type: Literal["custom"]

    updated_at: datetime

    description: Optional[str] = None

    profile_id: Optional[str] = None


class EntryPredefinedEntryConfidence(BaseModel):
    ai_context_available: bool
    """Indicates whether this entry has AI remote service validation."""

    available: bool
    """
    Indicates whether this entry has any form of validation that is not an AI remote
    service.
    """


class EntryPredefinedEntryVariantUnionMember0(BaseModel):
    """A Predefined AI prompt classification topic entry."""

    topic_type: Literal["Intent", "Content"]

    type: Literal["PromptTopic"]

    description: Optional[str] = None
    """
    A customer-facing explanation of what this predefined AI prompt topic
    represents.
    """


class EntryPredefinedEntryVariantUnionMember1(BaseModel):
    """A general predefined entry."""

    type: Literal["General"]

    description: Optional[str] = None
    """A customer-facing explanation of what this predefined entry represents."""


EntryPredefinedEntryVariant: TypeAlias = Union[
    EntryPredefinedEntryVariantUnionMember0, EntryPredefinedEntryVariantUnionMember1
]


class EntryPredefinedEntry(BaseModel):
    id: str

    confidence: EntryPredefinedEntryConfidence

    enabled: bool

    name: str

    type: Literal["predefined"]

    profile_id: Optional[str] = None

    variant: Optional[EntryPredefinedEntryVariant] = None
    """A Predefined AI prompt classification topic entry."""


class EntryIntegrationEntry(BaseModel):
    id: str

    created_at: datetime

    enabled: bool

    name: str

    type: Literal["integration"]

    updated_at: datetime

    profile_id: Optional[str] = None


class EntryExactDataEntry(BaseModel):
    id: str

    case_sensitive: bool
    """
    Only applies to custom word lists. Determines if the words should be matched in
    a case-sensitive manner Cannot be set to false if secret is true
    """

    created_at: datetime

    enabled: bool

    name: str

    secret: bool

    type: Literal["exact_data"]

    updated_at: datetime


class EntryDocumentFingerprintEntry(BaseModel):
    id: str

    created_at: datetime

    enabled: bool

    name: str

    type: Literal["document_fingerprint"]

    updated_at: datetime


class EntryWordListEntry(BaseModel):
    id: str

    created_at: datetime

    enabled: bool

    name: str

    type: Literal["word_list"]

    updated_at: datetime

    word_list: object

    profile_id: Optional[str] = None


Entry: TypeAlias = Union[
    EntryCustomEntry,
    EntryPredefinedEntry,
    EntryIntegrationEntry,
    EntryExactDataEntry,
    EntryDocumentFingerprintEntry,
    EntryWordListEntry,
]


class PredefinedProfile(BaseModel):
    id: str
    """The id of the predefined profile (uuid)."""

    allowed_match_count: int

    confidence_threshold: Optional[str] = None

    enabled_entries: List[str]
    """Entries to enable for this predefined profile.

    Any entries not provided will be disabled.
    """

    entries: List[Entry]
    """This field has been deprecated for `enabled_entries`."""

    name: str
    """The name of the predefined profile."""

    ai_context_enabled: Optional[bool] = None

    ocr_enabled: Optional[bool] = None

    open_access: Optional[bool] = None
    """Whether this profile can be accessed by anyone."""
