"""
Django settings for Voice Agent Backend.
Uses django-environ for env vars. Copy backend/.env.example to backend/.env and set
DATABASE_MASTER_URL (or legacy DATABASE_URL) and DATABASE_CLUSTER_URL.
"""
from pathlib import Path

import environ
from django.core.exceptions import ImproperlyConfigured

BASE_DIR = Path(__file__).resolve().parent.parent

env = environ.Env(
    DEBUG=(bool, False),
    ALLOWED_HOSTS=(list, []),
    CORS_ALLOWED_ORIGINS=(list, []),
    CSRF_TRUSTED_ORIGINS=(list, []),
    REDIS_URL=(str, "redis://127.0.0.1:6379/0"),
    LIVEKIT_URL=(str, "ws://127.0.0.1:7880"),
    LIVEKIT_API_KEY=(str, ""),
    LIVEKIT_API_SECRET=(str, ""),
)

# For local/dev: load backend/.env if variables aren't already set.
# In Docker, use backend/.env.docker (single-line KEY=VALUE) to avoid multiline parsing issues.
# IMPORTANT: do NOT overwrite variables already provided by the process environment
# (e.g. docker --env-file). Those should take precedence at runtime.
_docker_env = BASE_DIR / ".env.docker"
if _docker_env.exists():
    environ.Env.read_env(_docker_env, overwrite=False)
else:
    environ.Env.read_env(BASE_DIR / ".env", overwrite=False)

SECRET_KEY = env("SECRET_KEY", default="change-me-in-production")
DEBUG = env("DEBUG", default=True)
ALLOWED_HOSTS = env.list("ALLOWED_HOSTS", default=["127.0.0.1"])

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "rest_framework",
    "rest_framework.authtoken",
    "drf_spectacular",
    "corsheaders",
    "apps.users.apps.UsersConfig",
    "apps.conversations",
    "apps.knowledge_base",
    "apps.agents",
    "apps.calls",
    "apps.livekit",
]

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "config.db_middleware.CloseOldDbConnectionsMiddleware",
    "corsheaders.middleware.CorsMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
]

ROOT_URLCONF = "config.urls"
WSGI_APPLICATION = "config.wsgi.application"

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [],
        "APP_DIRS": True,
        "OPTIONS": {
            "context_processors": [
                "django.template.context_processors.debug",
                "django.template.context_processors.request",
                "django.contrib.auth.context_processors.auth",
                "django.contrib.messages.context_processors.messages",
            ],
        },
    },
]

# MySQL: master (default) + cluster — set both URLs in backend/.env
_mysql_options = {
    "charset": "utf8mb4",
    "init_command": "SET sql_mode='STRICT_TRANS_TABLES'",
}

def _master_db_url() -> str:
    url = env.str("DATABASE_MASTER_URL", default="").strip()
    if not url:
        url = env.str("DATABASE_URL", default="").strip()
    if not url:
        raise ImproperlyConfigured(
            "Set DATABASE_MASTER_URL (or DATABASE_URL) in backend/.env for the MySQL master database."
        )
    return url


_db_master = environ.Env.db_url_config(_master_db_url())
_db_master.setdefault("OPTIONS", {})
_db_master["OPTIONS"].update(_mysql_options)

_db_cluster = env.db("DATABASE_CLUSTER_URL")
_db_cluster.setdefault("OPTIONS", {})
_db_cluster["OPTIONS"].update(_mysql_options)

# MySQL / PyMySQL: avoid reusing connections the server has already closed.
# `close_old_connections()` (see `db_middleware`) + health checks makes polling
# endpoints (dashboard charts) resilient to idle disconnects.
_db_conn_max_age = env.int("DATABASE_CONN_MAX_AGE", default=60)
for _cfg in (_db_master, _db_cluster):
    _cfg.setdefault("CONN_MAX_AGE", _db_conn_max_age)
    _cfg.setdefault("CONN_HEALTH_CHECKS", True)

DATABASES = {
    "default": _db_master,      # livekitvoicebot_master
    "cluster": _db_cluster,     # livekitvoicebot_cluster
}

DATABASE_ROUTERS = ["config.db_router.MasterClusterRouter"]

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": env("REDIS_URL"),
        "OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient"},
    }
}

CELERY_BROKER_URL = env("REDIS_URL")
CELERY_RESULT_BACKEND = env("REDIS_URL")

AUTH_PASSWORD_VALIDATORS = [
    {"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator"},
    {"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator"},
    {"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator"},
    {"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator"},
]

LANGUAGE_CODE = "en-us"
TIME_ZONE = "UTC"
USE_I18N = True
USE_TZ = True
STATIC_URL = "static/"
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"

REST_FRAMEWORK = {
    "DEFAULT_PERMISSION_CLASSES": ["rest_framework.permissions.AllowAny"],
    "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination",
    "PAGE_SIZE": 20,
    "DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema",
    "DEFAULT_AUTHENTICATION_CLASSES": [
        "config.auth_backends.BearerTokenAuthentication",
        "rest_framework.authentication.TokenAuthentication",
        "rest_framework.authentication.SessionAuthentication",
    ],
}

SPECTACULAR_SETTINGS = {
    "TITLE": "Voicebot API",
    "DESCRIPTION": "Django REST API for bots, knowledge base, calls.",
    "VERSION": "1.0.0",
}

CORS_ALLOW_ALL_ORIGINS = DEBUG
if not DEBUG:
    CORS_ALLOWED_ORIGINS = env.list("CORS_ALLOWED_ORIGINS", default=[])
    CSRF_TRUSTED_ORIGINS = env.list("CSRF_TRUSTED_ORIGINS", default=[])

# LiveKit (local server)
LIVEKIT_URL = env("LIVEKIT_URL")
LIVEKIT_API_KEY = env("LIVEKIT_API_KEY")
LIVEKIT_API_SECRET = env("LIVEKIT_API_SECRET")
