"""
Django settings for core project.

Generated by 'django-admin startproject' using Django 6.0.

For more information on this file, see
https://docs.djangoproject.com/en/6.0/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/6.0/ref/settings/
"""

from datetime import timedelta
from pathlib import Path
import os
from dotenv import load_dotenv

# Load environment variables from .env file
load_dotenv()

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

REDIS_URL = os.getenv("REDIS_URL")

if REDIS_URL:
    # Production / any multi-process deployment: InMemoryChannelLayer only
    # broadcasts within a single process, so a message sent on one worker
    # never reaches a websocket connection held open by another worker.
    # Redis makes group_send/group_add visible across all of them.
    CHANNEL_LAYERS = {
        "default": {
            "BACKEND": "channels_redis.core.RedisChannelLayer",
            "CONFIG": {"hosts": [REDIS_URL]},
        }
    }
else:
    CHANNEL_LAYERS = {
        "default": {
            "BACKEND": "channels.layers.InMemoryChannelLayer",  # local dev only — set REDIS_URL to enable Redis
        }
    }

ASGI_APPLICATION = "core.asgi.application"

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/6.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.getenv("DJANGO_SECRET_KEY")

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = os.getenv("DJANGO_DEBUG", "False") == "True"

BASE_DIR = Path(__file__).resolve().parent.parent
load_dotenv(BASE_DIR / ".env")  # IMPORTANT

hosts = os.getenv("DJANGO_ALLOWED_HOSTS", "")

if hosts == "*":
    ALLOWED_HOSTS = ["*"]
else:
    ALLOWED_HOSTS = [h.strip() for h in hosts.split(",") if h.strip()]

DATABASE_ROUTERS = [
    "core.db_router.MultiTenantRouter",
]

# Application definition

INSTALLED_APPS = [
    # Must be the first app — this is what makes `manage.py runserver`
    # serve ASGI_APPLICATION (http + websockets) instead of Django's
    # default WSGI-only dev server. Requires `pip install daphne`.
    "daphne",
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "rest_framework",
    "rest_framework_simplejwt.token_blacklist",
    "rest_framework.authtoken",
    "channels",
    "master_admin",
    "school_admin",
    "academics",
    "schedules",
    "people",
    "fee",
    "tasks",
    "announcements",
    "attendance",
    "transport",
    "exam",
    "chat",
    "payslips",
    "stats",
    "activities",
    "teacher",
    "rest_framework_simplejwt",
    "corsheaders",
    "django_filters",
]

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "corsheaders.middleware.CorsMiddleware",  # CORS should be early
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    # 🔑 Authentication MUST come before your middleware
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    # ✅ YOUR middleware MUST come immediately after auth
    "core.middleware.school_context.SchoolContextMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
]

ROOT_URLCONF = "core.urls"

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [],
        "APP_DIRS": True,
        "OPTIONS": {
            "context_processors": [
                "django.template.context_processors.request",
                "django.contrib.auth.context_processors.auth",
                "django.contrib.messages.context_processors.messages",
            ],
        },
    },
]

WSGI_APPLICATION = "core.wsgi.application"

# Database
# https://docs.djangoproject.com/en/6.0/ref/settings/#databases

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": os.getenv("DB_DEFAULT_NAME", "dayscholor_master_db"),
        "USER": os.getenv("DB_DEFAULT_USER", "postgres"),
        "PASSWORD": os.getenv("DB_DEFAULT_PASSWORD", "1234"),
        "HOST": os.getenv("DB_DEFAULT_HOST", "localhost"),
        "PORT": os.getenv("DB_DEFAULT_PORT", "5432"),
    },
    "school": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": os.getenv("DB_SCHOOL_NAME", "checkings"),  # will be replaced in middleware
        "USER": os.getenv("DB_SCHOOL_USER", "postgres"),
        "PASSWORD": os.getenv("DB_SCHOOL_PASSWORD", "1234"),
        "HOST": os.getenv("DB_SCHOOL_HOST", "localhost"),
        "PORT": os.getenv("DB_SCHOOL_PORT", "5432"),
    },
}

# ── ZeptoMail Email Config ────────────────────────────────────────────────────
ZEPTO_SMTP_SERVER = os.getenv("ZEPTO_SMTP_SERVER", "smtp.zeptomail.in")
ZEPTO_PORT = int(os.getenv("ZEPTO_PORT", "587"))
ZEPTO_USERNAME = os.getenv("ZEPTO_USERNAME", "emailapikey")
ZEPTO_PASSWORD = os.getenv("ZEPTO_PASSWORD", "")
ZEPTO_FROM_EMAIL = os.getenv("ZEPTO_FROM_EMAIL", "noreply@dayscholor.com")
ZEPTO_MARKETING_EMAIL = os.getenv("ZEPTO_MARKETING_EMAIL", "Team Dayscholor <info@dayscholor.com>")
OTP_EXPIRY_MINUTES = int(os.getenv("OTP_EXPIRY_MINUTES", "10"))

# Google Gemini AI Configuration
GEMINI_API_KEY = os.getenv("GEMINI_API_KEY", "")

# Google Translate API Configuration
GOOGLE_TRANSLATE_API_KEY = os.getenv("GOOGLE_TRANSLATE_API_KEY", "")

# Password validation
# https://docs.djangoproject.com/en/6.0/ref/settings/#auth-password-validators

LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "verbose": {
            "format": "{levelname} {asctime} {module} {message}",
            "style": "{",
        },
    },
    "handlers": {
        "console": {
            "class": "logging.StreamHandler",
            "formatter": "verbose",
        },
    },
    "root": {
        "handlers": ["console"],
        "level": "INFO",
    },
    "loggers": {
        "core": {  # Change this to your project folder name
            "handlers": ["console"],
            "level": "DEBUG",
            "propagate": False,
        },
        "master_admin": {
            "handlers": ["console"],
            "level": "DEBUG",
            "propagate": False,
        },
    },
}

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",
    },
]

REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": (
        "core.authentication.SessionBoundJWTAuthentication",
    ),
    "DEFAULT_PAGINATION_CLASS": "core.pagination.DefaultPagination",
    "PAGE_SIZE": 10,
}

SIMPLE_JWT = {
    "ACCESS_TOKEN_LIFETIME": timedelta(hours=int(os.getenv("JWT_ACCESS_TOKEN_LIFETIME_HOURS", "24"))),
    "REFRESH_TOKEN_LIFETIME": timedelta(days=int(os.getenv("JWT_REFRESH_TOKEN_LIFETIME_DAYS", "30"))),
    "ROTATE_REFRESH_TOKENS": True,
    "BLACKLIST_AFTER_ROTATION": True,
    "UPDATE_LAST_LOGIN": False,
    "ALGORITHM": "HS256",
    "SIGNING_KEY": SECRET_KEY,
    "VERIFYING_KEY": None,
    "AUDIENCE": None,
    "ISSUER": None,
    "JWK_URL": None,
    "LEEWAY": 0,
    "AUTH_HEADER_TYPES": ("Bearer",),
    "AUTH_HEADER_NAME": "HTTP_AUTHORIZATION",
    "USER_ID_FIELD": "id",
    "USER_ID_CLAIM": "user_id",
    "USER_AUTHENTICATION_RULE": "rest_framework_simplejwt.authentication.default_user_authentication_rule",
    "AUTH_TOKEN_CLASSES": ("rest_framework_simplejwt.tokens.AccessToken",),
    "TOKEN_TYPE_CLAIM": "token_type",
    "TOKEN_USER_CLASS": "rest_framework_simplejwt.models.TokenUser",
    "JTI_CLAIM": "jti",
    # ✅ CRITICAL: Enable blacklist check
    "BLACKLIST_AFTER_ROTATION": True,  # This enables blacklist checking
}

CORS_ALLOWED_ORIGINS = os.getenv("CORS_ALLOWED_ORIGINS", "http://localhost:5173,http://localhost:3000").split(",")
CORS_ALLOW_CREDENTIALS = True

# Internationalization
# https://docs.djangoproject.com/en/6.0/topics/i18n/

LANGUAGE_CODE = "en-us"

TIME_ZONE = "UTC"

USE_I18N = True

USE_TZ = True

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/6.0/howto/static-files/

STATIC_URL = "static/"

MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, "media")