import os
from dotenv import load_dotenv


load_dotenv()

class Config:
    MONGO_URI = os.getenv('MONGO_URI')
    SECRET_KEY = os.getenv('SECRET_KEY')
    SMS_API_KEY = os.getenv('SMS_API_KEY')
    SMS_SENDER_ID = os.getenv('SMS_SENDER_ID')
    SMS_TEMPLATE_ID = os.getenv('SMS_TEMPLATE_ID')
    EMAIL_HOST = os.getenv('EMAIL_HOST')
    EMAIL_PORT = os.getenv('EMAIL_PORT')
    EMAIL_USER = os.getenv('EMAIL_USER')
    EMAIL_PASSWORD = os.getenv('EMAIL_PASSWORD')

import copy
import inspect
# ... other imports you already have ...

def _get_model_schema(model_class):
    """
    Return a JSON Schema dict for a Pydantic model class that is compatible with Gemini.
    Supports both pydantic v1 (schema()) and v2 (model_json_schema()).
    """
    # pydantic v2
    if hasattr(model_class, "model_json_schema"):
        raw = model_class.model_json_schema()
    # pydantic v1
    elif hasattr(model_class, "schema"):
        raw = model_class.schema()
    else:
        raise RuntimeError("Unsupported Pydantic version; can't produce schema.")

    return raw

def _remove_additional_properties(obj):
    """
    Recursively remove any 'additionalProperties' keys from the JSON schema structure,
    because Gemini API does not support that keyword.
    """
    if isinstance(obj, dict):
        obj.pop("additionalProperties", None)
        for k, v in list(obj.items()):
            _remove_additional_properties(v)
    elif isinstance(obj, list):
        for item in obj:
            _remove_additional_properties(item)

def build_response_schema_for_model_list(pydantic_model_class):
    """
    Build a cleaned schema equivalent to `List[Model]` for the Gemini API.
    """
    item_schema = _get_model_schema(pydantic_model_class)
    # copy to avoid mutating global model metadata
    item_schema = copy.deepcopy(item_schema)
    _remove_additional_properties(item_schema)

    # wrap as array-of-items schema
    array_schema = {
        "type": "array",
        "items": item_schema
    }
    return array_schema
