from datetime import timedelta
from pathlib import Path

import copy

from decouple import config

from django.utils.log import DEFAULT_LOGGING


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

SECRET_KEY = config("DJANGO_SECRET_KEY", default="insecure-change-me")
DEBUG = config("DJANGO_DEBUG", default=False, cast=bool)

LOG_DIR = BASE_DIR / "logs"
LOG_DIR.mkdir(parents=True, exist_ok=True)

LOGGING = copy.deepcopy(DEFAULT_LOGGING)
LOGGING["formatters"]["verbose"] = {
    "format": "%(asctime)s %(levelname)s %(name)s %(message)s",
}
LOGGING["handlers"]["django_file"] = {
    "level": "INFO",
    "class": "logging.handlers.TimedRotatingFileHandler",
    "filename": str(LOG_DIR / "django.log"),
    "when": "midnight",
    "backupCount": 30,
    "encoding": "utf-8",
    "formatter": "verbose",
}
LOGGING["handlers"]["recepciones_utils_file"] = {
    "level": "DEBUG",
    "class": "logging.handlers.TimedRotatingFileHandler",
    "filename": str(LOG_DIR / "recepciones_utils.log"),
    "when": "midnight",
    "backupCount": 30,
    "encoding": "utf-8",
    "formatter": "verbose",
}
LOGGING["loggers"]["django"]["handlers"] = list(
    dict.fromkeys(LOGGING["loggers"]["django"].get("handlers", []) + ["django_file"])
)
LOGGING["root"] = {
    "handlers": ["django_file"],
    "level": "INFO",
}
LOGGING["loggers"]["apps.recepciones.utils"] = {
    "handlers": ["recepciones_utils_file"],
    "level": "DEBUG",
    "propagate": False,
}

ON_SERVER = config("ON_SERVER", default=False, cast=bool)
API_PREFIX = config("API_PREFIX", default="/api")

ALLOWED_HOSTS = config("DJANGO_ALLOWED_HOSTS", default="localhost,127.0.0.1").split(",")

CORS_ALLOW_ALL_ORIGINS = config("CORS_ALLOW_ALL_ORIGINS", default=False, cast=bool)

CORS_ALLOWED_ORIGINS = [
    origin.strip()
    for origin in config("CORS_ALLOWED_ORIGINS", default="").split(",")
    if origin.strip()
]

CORS_ENABLED = CORS_ALLOW_ALL_ORIGINS or bool(CORS_ALLOWED_ORIGINS)

if CORS_ENABLED:
    CORS_ALLOW_CREDENTIALS = config("CORS_ALLOW_CREDENTIALS", default=True, cast=bool)
    CORS_ALLOW_HEADERS = [
        header.strip().lower()
        for header in config(
            "CORS_ALLOW_HEADERS",
            default="accept,authorization,content-type,origin,user-agent,x-csrftoken,x-requested-with,x-office-id",
        ).split(",")
        if header.strip()
    ]

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "rest_framework",
    "rest_framework_simplejwt",
    "drf_spectacular",
    "django_filters",
    "apps.catalogos.apps.CatalogosConfig",
    "apps.usuarios.apps.UsuariosConfig",
    "apps.boletas.apps.BoletasConfig",
    "apps.recepciones.apps.RecepcionesConfig",
    "apps.muestreo_laboratorio.apps.MuestreoLaboratorioConfig",
    "apps.expediente.apps.ExpedienteConfig",
    "apps.traspasos.apps.TraspasosConfig",
    "apps.movimientos.apps.MovimientosConfig",
]

if CORS_ENABLED:
    INSTALLED_APPS.insert(0, "corsheaders")

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "corsheaders.middleware.CorsMiddleware" if CORS_ENABLED else None,
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
]

MIDDLEWARE = [mw for mw in MIDDLEWARE if mw]

ROOT_URLCONF = "core.urls"

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",
            ],
        },
    }
]

WSGI_APPLICATION = "core.wsgi.application"
ASGI_APPLICATION = "core.asgi.application"

DB_ENGINE = config("DB_ENGINE", default="django.db.backends.postgresql")

DATABASES = {
    "default": {
        "ENGINE": DB_ENGINE,
        "NAME": config("DB_NAME", default="gemso_trigo"),
        "USER": config("DB_USER", default="postgres"),
        "PASSWORD": config("DB_PASSWORD", default="postgres"),
        "HOST": config("DB_HOST", default="127.0.0.1"),
        "PORT": config("DB_PORT", default="5432"),
    }
}

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 = config("DJANGO_LANGUAGE_CODE", default="es-mx")
TIME_ZONE = config("DJANGO_TIME_ZONE", default="America/Mexico_City")
USE_I18N = True
USE_TZ = True

STATIC_URL = "static/"
STATIC_ROOT = BASE_DIR / "staticfiles"

MEDIA_URL = "/media/"
MEDIA_ROOT = BASE_DIR / "media"

SERVE_MEDIA_PUBLIC = config("DJANGO_SERVE_MEDIA_PUBLIC", default=False, cast=bool)

DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"

REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": (
        "rest_framework_simplejwt.authentication.JWTAuthentication",
    ),
    "DEFAULT_PERMISSION_CLASSES": (
        "rest_framework.permissions.IsAuthenticated",
    ),
    "DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema",
    "DEFAULT_FILTER_BACKENDS": (
        "utils.office.OfficeFilterBackend",
        "django_filters.rest_framework.DjangoFilterBackend",
        "rest_framework.filters.SearchFilter",
        "rest_framework.filters.OrderingFilter",
    ),
    "EXCEPTION_HANDLER": "core.exceptions.custom_exception_handler",
}

SIMPLE_JWT = {
    "ACCESS_TOKEN_LIFETIME": timedelta(
        minutes=config("JWT_ACCESS_MINUTES", default=60, cast=int)
    ),
    "REFRESH_TOKEN_LIFETIME": timedelta(
        days=config("JWT_REFRESH_DAYS", default=7, cast=int)
    ),
}

SPECTACULAR_SETTINGS = {
    "TITLE": config("SPECTACULAR_TITLE", default="Gemso Trigo API"),
    "DESCRIPTION": config(
        "SPECTACULAR_DESCRIPTION",
        default="API para gestión agrícola (catálogos, usuarios/roles y boletas).",
    ),
    "VERSION": config("SPECTACULAR_VERSION", default="v1"),
    "SERVE_INCLUDE_SCHEMA": False,
}

if ON_SERVER:
    SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
    USE_X_FORWARDED_HOST = True
    FORCE_SCRIPT_NAME = API_PREFIX
    SPECTACULAR_SETTINGS["SERVERS"] = [
        {"url": API_PREFIX, "description": "API root"},
    ]

RECEPCIONES_ALERTA_PCT = config("RECEPCIONES_ALERTA_PCT", default=0.05, cast=float)
RECEPCIONES_MAX_FOTO_MB = config("RECEPCIONES_MAX_FOTO_MB", default=5, cast=int)

TRASPASO_MARGEN_PORCENTAJE = config("TRASPASO_MARGEN_PORCENTAJE", default=5.0, cast=float)

BASCULA_ACCESS_TOKEN = config("BASCULA_ACCESS_TOKEN", default="")
