"""Configuration for InterSystems IRIS vector database."""

from typing import Any

from pydantic import Field, PositiveInt, model_validator
from pydantic_settings import BaseSettings


class IrisVectorConfig(BaseSettings):
    """Configuration settings for IRIS vector database connection and pooling."""

    IRIS_HOST: str | None = Field(
        description="Hostname or IP address of the IRIS server.",
        default="localhost",
    )

    IRIS_SUPER_SERVER_PORT: PositiveInt | None = Field(
        description="Port number for IRIS connection.",
        default=1972,
    )

    IRIS_USER: str | None = Field(
        description="Username for IRIS authentication.",
        default="_SYSTEM",
    )

    IRIS_PASSWORD: str | None = Field(
        description="Password for IRIS authentication.",
        default="Dify@1234",
    )

    IRIS_SCHEMA: str | None = Field(
        description="Schema name for IRIS tables.",
        default="dify",
    )

    IRIS_DATABASE: str | None = Field(
        description="Database namespace for IRIS connection.",
        default="USER",
    )

    IRIS_CONNECTION_URL: str | None = Field(
        description="Full connection URL for IRIS (overrides individual fields if provided).",
        default=None,
    )

    IRIS_MIN_CONNECTION: PositiveInt = Field(
        description="Minimum number of connections in the pool.",
        default=1,
    )

    IRIS_MAX_CONNECTION: PositiveInt = Field(
        description="Maximum number of connections in the pool.",
        default=3,
    )

    IRIS_TEXT_INDEX: bool = Field(
        description="Enable full-text search index using %iFind.Index.Basic.",
        default=True,
    )

    IRIS_TEXT_INDEX_LANGUAGE: str = Field(
        description="Language for full-text search index (e.g., 'en', 'ja', 'zh', 'de').",
        default="en",
    )

    @model_validator(mode="before")
    @classmethod
    def validate_config(cls, values: dict[str, Any]) -> dict[str, Any]:
        """Validate IRIS configuration values.

        Args:
            values: Configuration dictionary

        Returns:
            Validated configuration dictionary

        Raises:
            ValueError: If required fields are missing or pool settings are invalid
        """
        # Only validate required fields if IRIS is being used as the vector store
        # This allows the config to be loaded even when IRIS is not in use

        # vector_store = os.environ.get("VECTOR_STORE", "")
        # We rely on Pydantic defaults for required fields if they are missing from env.
        # Strict existence check is removed to allow defaults to work.

        min_conn = values.get("IRIS_MIN_CONNECTION", 1)
        max_conn = values.get("IRIS_MAX_CONNECTION", 3)
        if min_conn > max_conn:
            raise ValueError("IRIS_MIN_CONNECTION must be less than or equal to IRIS_MAX_CONNECTION")

        return values
