"""

Django settings for PEZAJOB.

Each feature lives in its own app (views, models, urls, templates).



Merged from legacy pezajob settings (production domains, CORS, security,

logging, cache, editors, captcha) while keeping the upgraded app layout.

"""

import mimetypes

import os

from pathlib import Path



from dotenv import load_dotenv



load_dotenv()



BASE_DIR = Path(__file__).resolve().parent.parent



# ---------------------------------------------------------------------------

# Core

# ---------------------------------------------------------------------------

SECRET_KEY = os.getenv(

    'DJANGO_SECRET_KEY',

    'django-insecure-pezajob-dev-change-me-before-production',

)



DEBUG = os.getenv('DJANGO_DEBUG', os.environ.get('DEBUG', 'True')).lower() in (

    '1', 'true', 'yes',

)



_default_hosts = '127.0.0.1,localhost,testserver,pezajob.com,www.pezajob.com'

ALLOWED_HOSTS = [

    host.strip()

    for host in os.getenv('DJANGO_ALLOWED_HOSTS', _default_hosts).split(',')

    if host.strip()

]

if 'testserver' not in ALLOWED_HOSTS:

    ALLOWED_HOSTS.append('testserver')



CSRF_TRUSTED_ORIGINS = [

    origin.strip()

    for origin in os.getenv(

        'DJANGO_CSRF_TRUSTED_ORIGINS',

        'https://pezajob.com,https://www.pezajob.com,'

        'http://pezajob.com,http://www.pezajob.com,'

        'http://localhost:8000,http://127.0.0.1:8000,'

        'http://localhost:5173,http://127.0.0.1:5173',

    ).split(',')

    if origin.strip()

]



# CORS - React/Vite frontend on a different port in development

CORS_ALLOWED_ORIGINS = [

    origin.strip()

    for origin in os.getenv(

        'DJANGO_CORS_ALLOWED_ORIGINS',

        'http://localhost:5173,http://127.0.0.1:5173',

    ).split(',')

    if origin.strip()

]

CORS_ALLOW_CREDENTIALS = os.getenv(

    'DJANGO_CORS_ALLOW_CREDENTIALS', 'True',

).lower() in ('1', 'true', 'yes')



# ---------------------------------------------------------------------------

# Security

# ---------------------------------------------------------------------------

SECURE_CROSS_ORIGIN_OPENER_POLICY = 'same-origin-allow-popups'

X_FRAME_OPTIONS = 'SAMEORIGIN'

SECURE_BROWSER_XSS_FILTER = True

SECURE_CONTENT_TYPE_NOSNIFF = True

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')



if not DEBUG:

    SESSION_COOKIE_SECURE = True

    CSRF_COOKIE_SECURE = True

    SECURE_SSL_REDIRECT = os.getenv('DJANGO_SECURE_SSL', 'True').lower() in (

        '1', 'true', 'yes',

    )

    SECURE_HSTS_SECONDS = int(os.getenv('DJANGO_SECURE_HSTS_SECONDS', '31536000'))

    SECURE_HSTS_INCLUDE_SUBDOMAINS = True

    SECURE_HSTS_PRELOAD = True



# ---------------------------------------------------------------------------

# Applications

# ---------------------------------------------------------------------------

INSTALLED_APPS = [

    'django.contrib.admin',

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles',

    'django.contrib.sites',

    'django.contrib.humanize',

    'django.contrib.sitemaps',

    # Third-party

    'corsheaders',

    'django_user_agents',

    'ckeditor',

    'ckeditor_uploader',

    'tinymce',

    'hcaptcha',

    'rest_framework',

    'rest_framework.authtoken',

    'whitenoise.runserver_nostatic',

    # PEZAJOB apps

    'api.apps.ApiConfig',

    'accounts.apps.AccountsConfig',

    'home.apps.HomeConfig',

    'jobs.apps.JobsConfig',

    'companies.apps.CompaniesConfig',

    'taxonomy.apps.TaxonomyConfig',

    'seekers.apps.SeekersConfig',

    'employers.apps.EmployersConfig',

    'ats.apps.AtsConfig',

    'messaging.apps.MessagingConfig',

    'blog.apps.BlogConfig',

    'podcast.apps.PodcastConfig',

    'subscriptions.apps.SubscriptionsConfig',

    'testimonials.apps.TestimonialsConfig',

    'platform_admin.apps.PlatformAdminConfig',

]



MIDDLEWARE = [

    'django.middleware.security.SecurityMiddleware',

    'whitenoise.middleware.WhiteNoiseMiddleware',

    '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',

    'django_user_agents.middleware.UserAgentMiddleware',

]



ROOT_URLCONF = 'config.urls'



TEMPLATES = [

    {

        'BACKEND': 'django.template.backends.django.DjangoTemplates',

        'DIRS': [BASE_DIR / 'templates'],

        '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',

                'messaging.context_processors.messaging_context',

                'accounts.context_processors.notifications_context',

            ],

            'libraries': {
                'jobs_tags': 'jobs.templatetags.jobs_tags',
            },

        },

    },

]



WSGI_APPLICATION = 'config.wsgi.application'



# ---------------------------------------------------------------------------

# Database

# ---------------------------------------------------------------------------

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.sqlite3',

        'NAME': os.environ.get('PEZAJOB_DB_NAME', os.environ.get(

            'DJANGO_DB_NAME', str(BASE_DIR / 'db.sqlite3'),

        )),

    }

}



_db_engine = os.getenv('DJANGO_DB_ENGINE')

if _db_engine:

    DATABASES = {

        'default': {

            'ENGINE': _db_engine,

            'NAME': os.getenv('DJANGO_DB_NAME', 'pezajob'),

            'USER': os.getenv('DJANGO_DB_USER', ''),

            'PASSWORD': os.getenv('DJANGO_DB_PASSWORD', ''),

            'HOST': os.getenv('DJANGO_DB_HOST', 'localhost'),

            'PORT': os.getenv('DJANGO_DB_PORT', '5432'),

        }

    }



# ---------------------------------------------------------------------------

# Auth

# ---------------------------------------------------------------------------

AUTH_USER_MODEL = 'accounts.User'



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'},

]



LOGIN_URL = 'accounts:login'

LOGIN_REDIRECT_URL = 'home:index'

LOGOUT_REDIRECT_URL = 'home:index'



# ---------------------------------------------------------------------------

# i18n

# ---------------------------------------------------------------------------

LANGUAGE_CODE = 'en-us'

TIME_ZONE = os.getenv('DJANGO_TIME_ZONE', 'Africa/Lusaka')

USE_I18N = True

USE_TZ = True



# ---------------------------------------------------------------------------

# Static & media

# ---------------------------------------------------------------------------

STATIC_URL = '/static/'

STATICFILES_DIRS = [BASE_DIR / 'static']

STATIC_ROOT = BASE_DIR / 'staticfiles'

_staticfiles_backend = os.getenv(
    'DJANGO_STATICFILES_STORAGE',
    (
        'whitenoise.storage.CompressedManifestStaticFilesStorage'
        if not DEBUG
        else 'django.contrib.staticfiles.storage.StaticFilesStorage'
    ),
)

STORAGES = {

    'default': {

        'BACKEND': 'django.core.files.storage.FileSystemStorage',

    },

    'staticfiles': {

        'BACKEND': _staticfiles_backend,

    },

}



MEDIA_URL = '/media/'

MEDIA_ROOT = BASE_DIR / 'media'



mimetypes.add_type('text/css', '.css', True)

mimetypes.add_type('application/javascript', '.js', True)

mimetypes.add_type('image/svg+xml', '.svg', True)

mimetypes.add_type('font/woff', '.woff', True)

mimetypes.add_type('font/woff2', '.woff2', True)



DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'



# ---------------------------------------------------------------------------

# Site

# ---------------------------------------------------------------------------

SITE_ID = int(os.getenv('DJANGO_SITE_ID', '1'))

SITE_DOMAIN = os.getenv('DJANGO_SITE_DOMAIN', 'pezajob.com')

SITE_NAME = os.getenv('DJANGO_SITE_NAME', 'Pezajob')

SITE_URL = os.getenv('DJANGO_SITE_URL', 'http://127.0.0.1:8000')



# ---------------------------------------------------------------------------

# Email

# ---------------------------------------------------------------------------

DEFAULT_FROM_EMAIL = os.getenv('DJANGO_DEFAULT_FROM_EMAIL', 'noreply@pezajob.com')

ADMIN_CONTACT_EMAIL = os.getenv('DJANGO_ADMIN_CONTACT_EMAIL', 'admin@pezajob.com')

EMAIL_TIMEOUT = int(os.getenv('DJANGO_EMAIL_TIMEOUT', '30'))



if DEBUG:

    EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

else:

    EMAIL_BACKEND = os.getenv(

        'DJANGO_EMAIL_BACKEND',

        'django.core.mail.backends.smtp.EmailBackend',

    )

    EMAIL_HOST = os.getenv('DJANGO_EMAIL_HOST', '')

    EMAIL_PORT = int(os.getenv('DJANGO_EMAIL_PORT', '587'))

    EMAIL_HOST_USER = os.getenv('DJANGO_EMAIL_HOST_USER', '')

    EMAIL_HOST_PASSWORD = os.getenv('DJANGO_EMAIL_HOST_PASSWORD', '')

    EMAIL_USE_TLS = os.getenv('DJANGO_EMAIL_USE_TLS', 'True').lower() in (

        '1', 'true', 'yes',

    )



# ---------------------------------------------------------------------------

# PEZAJOB features

# ---------------------------------------------------------------------------

SEEKER_PLUS_PLAN_SLUG = os.getenv(

    'DJANGO_SEEKER_PLUS_PLAN_SLUG', 'seeker-professional-plus',

)

COMPANY_DEFAULT_PLAN_SLUG = os.getenv(

    'DJANGO_COMPANY_DEFAULT_PLAN_SLUG', 'company-professional',

)

COMPANY_ENTERPRISE_PLAN_SLUG = os.getenv(

    'DJANGO_COMPANY_ENTERPRISE_PLAN_SLUG', 'company-enterprise',

)

JOB_ALERT_MIN_MATCH_SCORE = int(os.getenv('DJANGO_JOB_ALERT_MIN_MATCH_SCORE', '40'))

DPO_COMPANY_TOKEN = os.getenv('DPO_COMPANY_TOKEN', '')

DPO_SERVICE_TYPE = os.getenv('DPO_SERVICE_TYPE', '88938')



# ---------------------------------------------------------------------------

# CKEditor

# ---------------------------------------------------------------------------

CKEDITOR_JQUERY_URL = (

    'https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js'

)

CKEDITOR_UPLOAD_PATH = 'uploads/'

CKEDITOR_IMAGE_BACKEND = 'pillow'

CKEDITOR_CONFIGS = {

    'default': {

        'toolbar': None,

    },

}



# ---------------------------------------------------------------------------

# TinyMCE

# ---------------------------------------------------------------------------

TINYMCE_DEFAULT_CONFIG = {

    'menubar': 'file edit view insert format tools table help',

    'plugins': (

        'contextmenu advlist autolink lists link image charmap print preview anchor '

        'searchreplace visualblocks code fullscreen insertdatetime media table paste '

        'code help wordcount spellchecker'

    ),

    'toolbar': (

        'undo redo | bold italic underline strikethrough | fontselect fontsizeselect '

        'formatselect | alignleft aligncenter alignright alignjustify | outdent indent | '

        'numlist bullist checklist | forecolor backcolor casechange permanentpen '

        'formatpainter removeformat | pagebreak | charmap emoticons | fullscreen preview '

        'save print | insertfile image media pageembed template link anchor codesample | '

        'a11ycheck ltr rtl | showcomments addcomment code'

    ),

    'custom_undo_redo_levels': 10,

    'language': 'en_EN',

    'contextmenu': 'paste copy |link image inserttable | cell row column deletetable',

}



# ---------------------------------------------------------------------------

# Captcha (set keys in .env - never commit real secrets)

# ---------------------------------------------------------------------------

HCAPTCHA_SITEKEY = os.getenv('HCAPTCHA_SITEKEY', '')

HCAPTCHA_SECRET = os.getenv('HCAPTCHA_SECRET', '')

RECAPTCHA_PUBLIC_KEY = os.getenv('RECAPTCHA_PUBLIC_KEY', '')

RECAPTCHA_PRIVATE_KEY = os.getenv('RECAPTCHA_PRIVATE_KEY', '')



# ---------------------------------------------------------------------------

# File uploads

# ---------------------------------------------------------------------------

FILE_UPLOAD_MAX_MEMORY_SIZE = int(

    os.getenv('DJANGO_FILE_UPLOAD_MAX_MEMORY_SIZE', str(5 * 1024 * 1024)),

)

DATA_UPLOAD_MAX_MEMORY_SIZE = int(

    os.getenv('DJANGO_DATA_UPLOAD_MAX_MEMORY_SIZE', str(5 * 1024 * 1024)),

)

FILE_UPLOAD_PERMISSIONS = 0o644

FILE_UPLOAD_DIRECTORY_PERMISSIONS = 0o755



# ---------------------------------------------------------------------------

# Cache

# ---------------------------------------------------------------------------

CACHES = {

    'default': {

        'BACKEND': os.getenv(

            'DJANGO_CACHE_BACKEND',

            'django.core.cache.backends.locmem.LocMemCache',

        ),

        'LOCATION': os.getenv('DJANGO_CACHE_LOCATION', 'pezajob-cache'),

    }

}

CACHE_MIDDLEWARE_SECONDS = int(os.getenv('DJANGO_CACHE_MIDDLEWARE_SECONDS', '3600'))



# ---------------------------------------------------------------------------

# Logging

# ---------------------------------------------------------------------------

LOGGING = {

    'version': 1,

    'disable_existing_loggers': False,

    'formatters': {

        'verbose': {

            'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',

            'style': '{',

        },

        'simple': {

            'format': '{levelname} {message}',

            'style': '{',

        },

    },

    'handlers': {

        'file': {

            'level': 'ERROR',

            'class': 'logging.FileHandler',

            'filename': BASE_DIR / 'django_errors.log',

            'formatter': 'verbose',

        },

        'console': {

            'level': 'INFO',

            'class': 'logging.StreamHandler',

            'formatter': 'simple',

        },

    },

    'loggers': {

        'django': {

            'handlers': ['file', 'console'],

            'level': 'ERROR',

            'propagate': True,

        },

    },

}



# ---------------------------------------------------------------------------

# Django REST Framework

# ---------------------------------------------------------------------------

REST_FRAMEWORK = {

    'DEFAULT_AUTHENTICATION_CLASSES': [

        'rest_framework.authentication.TokenAuthentication',

        'rest_framework.authentication.SessionAuthentication',

    ],

    'DEFAULT_PERMISSION_CLASSES': [

        'rest_framework.permissions.IsAuthenticatedOrReadOnly',

    ],

    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',

    'PAGE_SIZE': int(os.getenv('DJANGO_API_PAGE_SIZE', '20')),

    'DEFAULT_FILTER_BACKENDS': [

        'rest_framework.filters.SearchFilter',

        'rest_framework.filters.OrderingFilter',

    ],

    'DEFAULT_RENDERER_CLASSES': [

        'rest_framework.renderers.JSONRenderer',

        'rest_framework.renderers.BrowsableAPIRenderer',

    ],

}


