"""
Django settings for questbanker_api project.

Generated by 'django-admin startproject' using Django 3.2.15.

For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""
# from rest_framework.settings import APISettings
import os
from pathlib import Path
from decouple import config
import datetime
import sentry_sdk

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent


# bash added logs
LOG_DIR = BASE_DIR / "logs"
LOG_FILE_PATH = LOG_DIR / "slow_requests.log"

LOG_DIR.mkdir(parents=True, exist_ok=True)

# end of bash log files

MEDIA_URL = '/mediafiles/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'mediafiles')

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = config('SECRET_KEY', default='')

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = config('DEBUG', default=True, cast=bool)

ALLOWED_HOSTS = ['localhost', '127.0.0.1', 'qbcoreapi.questdigito.com', '192.168.1.10', '192.168.1.9', '0.0.0.0']

# Application definition

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',
    'django_filters',
    'corsheaders',
    'organisations',
    'users',
    'customers',
    'programs',
    'general',
    'savings',
    'ledgers',
    'locations',
    'loans',
    'external_loans',
    'reports',
    'shares',
    'exservices',
    'mmbanking',
    'mmcharges',
    'mobileapp',
    'inventory',
    'ussdbanking',
    'ussd',
    'integrations',
    'vas',
    'overdraft',
    'notifications',
    'budgets',
    # 'silk'
    #'silk',
    'custom_searches',
    'license',
    'fixed_asset',
    'chat',
    'crb',
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'questbanker_api.middleware.SavingsAccountLifecycleMiddleware',
    'questbanker_api.middleware.PartnerAccessMiddleware',  # Add partner access middleware
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'questbanker_api.middleware.SlowRequestMiddleware'
]

CORS_ALLOW_METHODS = [
    'GET',
    'POST',
    'PUT',
    'PATCH',
    'DELETE',
    'OPTIONS',
]

CORS_ORIGIN_ALLOW_ALL = True
# CORS_ALLOWED_ORIGINS = [
#     "http://localhost:3000",  # React frontend
#     "http://127.0.0.1:3000",
# ]

CORS_ORIGIN_WHITELIST = [
     'http://localhost:3000'
]



CORS_ALLOW_HEADERS = [
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'origin',
    'user-agent',
    # 'x-csrftoken JXWFBAYJ7XI7VYMOYHUXZIHXQNTAFI3I',
    'x-requested-with',
]

CORS_EXPOSE_HEADERS = [
    "Access-Control-Allow-Origin",
    "Access-Control-Allow-Methods",
    "Access-Control-Allow-Headers",
]



ROOT_URLCONF = 'questbanker_api.urls'

CORS_ALLOW_CREDENTIALS = True 

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 = 'questbanker_api.wsgi.application'

AUTH_USER_MODEL = 'users.User'

# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': config('QB_DB_NAME', default=''),
        'USER': config('QB_DB_USERNAME', default=''),
        'PASSWORD': config('QB_DB_PASSWORD', default=''),
        'HOST': config('QB_DB_HOSTNAME', default=''),
        'PORT': config('QB_DB_PORT', default=5432, cast=int)
    }
}

# authentication settings
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'questbanker_api.pagination.CustomPageNumberPagination',
    'PAGE_SIZE': 25,
    # 'DEFAULT_ORDERING': ['id'],
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend' ,),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'users.helper.CustomJSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated',
    'rest_framework.permissions.AllowAny',
    ),
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.UserRateThrottle',
        'rest_framework.throttling.AnonRateThrottle',
    ],
    'DEFAULT_THROTTLE_RATES': {
        'user': '200/minute',  # Normal users can make 200 requests per minute
        'anon': '100/minute',    # Anonymous users can make 100 requests per minute
        'org_wallet': '60/minute',
        'member_wallet': '120/minute',
    }
} 

# set JWT key expiry
JWT_AUTH = {
    'JWT_RESPONSE_PAYLOAD_HANDLER':'questbanker_api.utils.custom_jwt_response_handler',
    'JWT_AUTH_HEADER_PREFIX': 'Bearer',
    # Expire original token after 2 days
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=2),
}



# Password validation
# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators

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


# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Africa/Nairobi'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

CORS_ORIGIN_WHITELIST = [
     'http://localhost:3000'
]

AWS_ACCESS_KEY_ID = config('AWS_ACCESS_KEY_ID', default='')
AWS_SECRET_ACCESS_KEY = config('AWS_SECRET_ACCESS_KEY', default='')
AWS_S3_SIGNATURE_VERSION = config('AWS_S3_SIGNATURE_VERSION', default='')
AWS_S3_REGION_NAME = config('AWS_S3_REGION_NAME', default='')
AWS_STORAGE_BUCKET_NAME = config('AWS_STORAGE_BUCKET_NAME', default='')

QB_SMS_URL = config('QB_SMS_URL', default='')

# GNUGrid CRB Configuration
GNUGRID_API_END_POINT = config('GNUGRID_API_END_POINT', default='')
GNUGRID_CLIENT_ID = config('GNUGRID_CLIENT_ID', default='')
GNUGRID_CLIENT_SECRET = config('GNUGRID_CLIENT_SECRET', default='') 


LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'level': 'WARNING',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': str(LOG_FILE_PATH),
            'maxBytes': 10*1024*1024,  # 10 MB per log file
            'backupCount': 5,  # Keep 5 old log files
            'formatter': 'detailed',
        },
    },
    'formatters': {
        'detailed': {
            'format': '{levelname} {asctime} {module} {message}',
            'style': '{',
        },
    },
    'loggers': {
        'django.request': {
            'handlers': ['file'],
            'level': 'WARNING',
            'propagate': True,
        },
        'savings': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': False,
        },
    },
}



sentry_sdk.init(
    dsn="https://92d58f3639a2bdad244dd1fe490e4a6d@o471486.ingest.us.sentry.io/4507890426052608",
    # dns="https://2fd6204e604dcc7d483d3dcc045f7999@o4508341494284288.ingest.us.sentry.io/4508341504770048",
    # Set traces_sample_rate to 1.0 to capture 100%
    # of transactions for tracing.
    traces_sample_rate=1.0,
    # Set profiles_sample_rate to 1.0 to profile 100%
    # of sampled transactions.
    # We recommend adjusting this value in production.
    profiles_sample_rate=1.0,
)


# """
# Django settings for questbanker_api project.

# Generated by 'django-admin startproject' using Django 3.2.15.

# For more information on this file, see
# https://docs.djangoproject.com/en/3.2/topics/settings/

# For the full list of settings and their values, see
# https://docs.djangoproject.com/en/3.2/ref/settings/
# """
# # from rest_framework.settings import APISettings
# import os
# from pathlib import Path
# from decouple import config
# import datetime
# import sentry_sdk

# # Build paths inside the project like this: BASE_DIR / 'subdir'.
# BASE_DIR = Path(__file__).resolve().parent.parent

# MEDIA_URL = '/mediafiles/'
# MEDIA_ROOT = os.path.join(BASE_DIR, 'mediafiles')

# # Quick-start development settings - unsuitable for production
# # See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/

# # SECURITY WARNING: keep the secret key used in production secret!
# SECRET_KEY = config('SECRET_KEY', default='')

# # SECURITY WARNING: don't run with debug turned on in production!
# DEBUG = config('DEBUG', default=True, cast=bool)

# ALLOWED_HOSTS = ['localhost', '127.0.0.1', 'qbcoreapi.questdigito.com']

# # Application definition

# 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',
#     'rest_framework_jwt',
#     'django_filters',
#     'corsheaders',
#     'organisations',
#     'users',
#     'customers',
#     'programs',
#     'general',
#     'savings',
#     'ledgers',
#     'locations',
#     'loans',
#     'reports',
#     'shares',
#     'exservices',
#     'mmbanking',
#     'mobileapp',
#     'inventory',
#     'ussdbanking',
#     'ussd',
#     'integrations',
#     'overdraft',
#     'notifications',
#     # 'silk'
#     #'silk',
#     'custom_searches',
#     'license',
#     'fixed_asset',
# ]

# MIDDLEWARE = [
#     # 'corsheaders.middleware.CorsMiddleware',
#     'django.middleware.security.SecurityMiddleware',
#     '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',
#     'questbanker_api.corsMiddleware.CorsMiddleware'
# ]

# # CORS_ORIGIN_ALLOW_ALL = True

# # CORS_ALLOW_HEADERS = [
# #     'accept',
# #     'accept-encoding',
# #     'authorization',
# #     'content-type',
# #     'origin',
# #     'user-agent',
# #     # 'x-csrftoken JXWFBAYJ7XI7VYMOYHUXZIHXQNTAFI3I',
# #     'x-requested-with',
# # ]

# ROOT_URLCONF = 'questbanker_api.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 = 'questbanker_api.wsgi.application'

# AUTH_USER_MODEL = 'users.User'

# # Database
# # https://docs.djangoproject.com/en/3.2/ref/settings/#databases

# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.postgresql',
#         'NAME': config('QB_DB_NAME', default=''),
#         'USER': config('QB_DB_USERNAME', default=''),
#         'PASSWORD': config('QB_DB_PASSWORD', default=''),
#         'HOST': config('QB_DB_HOSTNAME', default=''),
#         'PORT': config('QB_DB_PORT', default=5432, cast=int)
#     }
# }

# # authentication settings
# REST_FRAMEWORK = {
#     'DEFAULT_PAGINATION_CLASS': 'questbanker_api.pagination.CustomPageNumberPagination',
#     'PAGE_SIZE': 25,
#     'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend' ,),
#     'DEFAULT_AUTHENTICATION_CLASSES': (
#         #'rest_framework_jwt.authentication.JSONWebTokenAuthentication',   ---> Disable this when using CustomJSONWebTokenAuthentication
#         'users.helper.CustomJSONWebTokenAuthentication',
#         'rest_framework.authentication.SessionAuthentication',
#     ),
#     'DEFAULT_PERMISSION_CLASSES': (
#     'rest_framework.permissions.IsAuthenticated',
#     'rest_framework.permissions.AllowAny',
#     ),
#     'DEFAULT_THROTTLE_CLASSES': [
#         'rest_framework.throttling.UserRateThrottle',
#         'rest_framework.throttling.AnonRateThrottle',
#     ],
#     'DEFAULT_THROTTLE_RATES': {
#         'user': '200/minute',  # Normal users can make 200 requests per minute
#         'anon': '100/minute',    # Anonymous users can make 100 requests per minute
#     }
# } 

# # set JWT key expiry
# JWT_AUTH = {
#     'JWT_RESPONSE_PAYLOAD_HANDLER':'questbanker_api.utils.custom_jwt_response_handler',
#     'JWT_AUTH_HEADER_PREFIX': 'Bearer',
#     # Expire original token after 2 days
#     'JWT_EXPIRATION_DELTA': datetime.timedelta(days=2),
# }


# # Password validation
# # https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators

# 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',
#     },
# ]


# # Internationalization
# # https://docs.djangoproject.com/en/3.2/topics/i18n/

# LANGUAGE_CODE = 'en-us'

# TIME_ZONE = 'Africa/Nairobi'

# USE_I18N = True

# USE_L10N = True

# USE_TZ = True


# # Static files (CSS, JavaScript, Images)
# # https://docs.djangoproject.com/en/3.2/howto/static-files/

# STATIC_URL = '/static/'
# STATIC_ROOT = os.path.join(BASE_DIR, 'static')

# # Default primary key field type
# # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field

# DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

# CORS_ORIGIN_WHITELIST = [
#      'http://localhost:3000'
# ]

# AWS_ACCESS_KEY_ID = config('AWS_ACCESS_KEY_ID', default='')
# AWS_SECRET_ACCESS_KEY = config('AWS_SECRET_ACCESS_KEY', default='')
# AWS_S3_SIGNATURE_VERSION = config('AWS_S3_SIGNATURE_VERSION', default='')
# AWS_S3_REGION_NAME = config('AWS_S3_REGION_NAME', default='')
# AWS_STORAGE_BUCKET_NAME = config('AWS_STORAGE_BUCKET_NAME', default='')

# QB_SMS_URL = config('QB_SMS_URL', default='') 


# sentry_sdk.init(
#     dsn="https://92d58f3639a2bdad244dd1fe490e4a6d@o471486.ingest.us.sentry.io/4507890426052608",
#     # dns="https://2fd6204e604dcc7d483d3dcc045f7999@o4508341494284288.ingest.us.sentry.io/4508341504770048",
#     # Set traces_sample_rate to 1.0 to capture 100%
#     # of transactions for tracing.
#     traces_sample_rate=1.0,
#     # Set profiles_sample_rate to 1.0 to profile 100%
#     # of sampled transactions.
#     # We recommend adjusting this value in production.
#     profiles_sample_rate=1.0,

# Django Channels Configuration - Commented out (channels not installed)
# ASGI_APPLICATION = 'questbanker_api.asgi.application'

# # Channel layers configuration
# CHANNEL_LAYERS = {
#     'default': {
#         'BACKEND': 'channels_redis.core.RedisChannelLayer',
#         'CONFIG': {
#             "hosts": [('127.0.0.1', 6379)],
#         },
#     },
# }
# )
# Organization Configuration
# Finwise organization ID for group customer filtering
FINWISE_ORGANIZATION_ID = config('FINWISE_ORGANIZATION_ID', default=147, cast=int)
