"""
Django settings for tixsell project.

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

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

For the full list of settings and their values, see
https://docs.tixsell.com/en/4.0/ref/settings/
"""
import os
from datetime import timedelta
from pathlib import Path
import json
from celery.schedules import crontab
import redis,os
from backoffice.BlockchainTaskManager import WalletPool

r = redis.Redis(host='localhost', port=6379, db=0,password=os.getenv("REDIS_PWD"), decode_responses=True)
wallet_list = ['wallet1', 'wallet2', 'wallet3', 'wallet4', 'wallet5'] 
wallet_pool = WalletPool(r, wallet_list)

# Opening JSON file
f = open('../ABI/ticket_abi.json')
TICKET_ABI = json.load(f)
f.close() 

f = open('../ABI/ticketType_abi.json')
TICKET_TYPE_ABI = json.load(f)
f.close() 

f = open('../ABI/organiser_factory_abi.json')
ORGANISER_FACTORY_ABI = json.load(f)
f.close() 

f = open('../ABI/organizer_abi.json')
ORGANISER_ABI = json.load(f)
f.close() 

f = open('../ABI/event_abi.json')
EVENT_ABI = json.load(f)
f.close() 

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


PINATA_API_KEY = os.getenv("PINATA_API_KEY")

POSTGRESQL_ADDON_URI = os.getenv("POSTGRESQL_ADDON_URI")
POSTGRESQL_ADDON_PORT = os.getenv("POSTGRESQL_ADDON_PORT")
POSTGRESQL_ADDON_HOST = os.getenv("POSTGRESQL_ADDON_HOST")
POSTGRESQL_ADDON_DB = os.getenv("POSTGRESQL_ADDON_DB")
POSTGRESQL_ADDON_PASSWORD = os.getenv("POSTGRESQL_ADDON_PASSWORD")
POSTGRESQL_ADDON_USER = os.getenv("POSTGRESQL_ADDON_USER")

############ WALLETS ##############################################
SELLTIX_WALLET=os.getenv("SELLTIX_WALLET")
SELLTIX_WALLET_PRIVATE_KEY=os.getenv("SELLTIX_PRIVATE_KEY")

SELLTIX_WALLET2=os.getenv("SELLTIX_WALLET2")
SELLTIX_WALLET_PRIVATE_KEY2=os.getenv("SELLTIX_PRIVATE_KEY2")

SELLTIX_WALLET3=os.getenv("SELLTIX_WALLET3")
SELLTIX_WALLET_PRIVATE_KEY3=os.getenv("SELLTIX_PRIVATE_KEY3")

SELLTIX_WALLET4=os.getenv("SELLTIX_WALLET4")
SELLTIX_WALLET_PRIVATE_KEY4=os.getenv("SELLTIX_PRIVATE_KEY4")

SELLTIX_WALLET5=os.getenv("SELLTIX_WALLET5")
SELLTIX_WALLET_PRIVATE_KEY5=os.getenv("SELLTIX_PRIVATE_KEY5")

COINAPI_KEY=os.getenv("COINAPI_KEY")
# Quick-start development settings - unsuitable for production
# See https://docs.tixsell.com/en/4.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = "dfkgfkdhm45545k45m5m%66$fdsfñlgsglgfm,mgmdfñgfgf"

# SECURITY WARNING: don't run with debug turned on in production!
SENDGRID_API_KEY="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"
WEBRTC_API_KEY="apzkey:00eb757ae75c7a3fc7be109c72985c95"
VIDEO_RTC_API_KEY="cab81fce-7a2d-442a-9733-38155c6a7a38"
VIDEO_RTC_SECRET_KEY="d8439bd27e267be677a89ca470e04ddac60e1be29a15e8206af0b0520af221a1"

DAILY_API_KEY=os.getenv("DAILY_API_KEY")
DEBUG = os.getenv("DEBUG")
if DEBUG:
    CONTRACT_NODE_URL = "https://polygon-amoy.g.alchemy.com/v2/4lHilJsuuMP5aOZLcatJ_SgCGsjLtNla"
    NETWORK="MATIC_AMOY"
    CHAIN_ID=80002
    ORGAFACTORY_ADDRESS="0x3f9ae5011e3f7DEef76237427c82f20a8aAB864C"
    AlchemyTokenWebHook="xxfQ8423ojyL796aRqd7dS5yoTIoy8ux"
    ALCHEMY_API_ENDPOINT="https://polygon-amoy.g.alchemy.com/v2/"
    ALCHEMY_API_ENDPOINT_NFT="https://polygon-amoy.g.alchemy.com/nft/v3/"
    ALCHEMY_ACCESS_KEY="alcht_tZGMDXIsU6FUd8YXWe0ACTwamN0jby"
    STRIPE_PUBLIC_KEY = 'pk_test_51POy7PLDTPrPPxGggL7Gcsz3bixqIuiujRNV8z9Xr7LC9Rg8379iuroqmZ97sKKRL2u7ATC41y8DnLU22eNCmmDd008pgPq2GZ'
    STRIPE_ENDPOINT="whsec_vtwhnmnv0ag3r1a4BmwCogH5LgrzsVN6"
    CLIENT_ID="ca_Ohbyl1lPMPGpChI19qBCPSUWUPnPNMod"
    STRIPE_API_KEY="sk_test_51POy7PLDTPrPPxGg6j6dseXEsgATjSaIy45EUZlhhIFKxdJWhc5nUIKvusV8ZBgsylWqnZT9ypx0wbe3qlBavnsE00wnqpdZB8"
    BITMOVING_AKI_KEY="5cf38f71-c6d1-4a90-a83e-845de2459888"
    POLYGON_EXPLORER="https://amoy.polygonscan.com/address/"
else:
    CONTRACT_NODE_URL = "https://polygon-mainnet.g.alchemy.com/v2/eBgnB26p56Y0PfH13jUUHYt4jVJXKtJ3"
    NETWORK="MATIC_MAINNET"
    CHAIN_ID=137
    ORGAFACTORY_ADDRESS=""
    AlchemyTokenWebHook="xxfQ8423ojyL796aRqd7dS5yoTIoy8ux"
    ALCHEMY_API_ENDPOINT="https://polygon-mainnet.g.alchemy.com/v2/"
    ALCHEMY_API_ENDPOINT_NFT="https://polygon-mainnet.g.alchemy.com/nft/v3/"
    ALCHEMY_ACCESS_KEY="alcht_tNkXkwnHE5GohaCeH2wAGHThNIStNF"
    STRIPE_PUBLIC_KEY = 'pk_live_51POy7PLDTPrPPxGgUzIFGkfJ7dNjnme7CjHJwXIl1ayc9PPuEQI7lSaBp1y5l8OCNJss0ptAkzqKHA17OL1aASq600A2lesGRB'
    STRIPE_API_KEY = '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'
    STRIPE_ENDPOINT="whsec_Skq9Qhn7AqiBnJXTJeBDrLGjI7Zd7a2E"
    CLIENT_ID=""
    BITMOVING_AKI_KEY="5cf38f71-c6d1-4a90-a83e-845de2459888"
    POLYGON_EXPLORER="https://polygonscan.com/address/"
     

LOGIN_REDIRECT_URL = 'home'
LOGOUT_REDIRECT_URL ='home'


TEMPLATE_ID_CODESELLTIX="d-867c37b237014ef6939b702304b5dec8"
TEMPLATE_ID_RAPPELEVENT="d-83615d3908024553ab80ff8d392e75f8"
TEMPLATE_ID_OFFRIR="d-854a758096fa412abbc0cc1e7882dad0"
TEMPLATE_ID_FACTURE="d-76108642b3c949ebb4c1ddc3b8ce7190"
TEMPLATE_ID_OFFRIR_CONTENU="d-7f37594da5d9445e80c5abdb3481457b"
TEMPLATE_ID_TICKET_VENDU="d-c178f03355c448e0ad26b8a317de0be9"
#code_selltix 

ALLOWED_HOSTS = ['api.selltix.live','www.selltix.live','localhost','127.0.0.1']

AUTH_USER_MODEL='backoffice.User'
# Application definition
 
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',
    'crispy_forms',
    'django_ajax',
    'django_filters',
    "corsheaders",
    'django_extensions',
     'rest_framework',     
    'sorl.thumbnail',
    'backoffice', 
     'storages',
     'drf_yasg',
     'django_ace',
] 
""" 
CRONJOBS = [
    ('* * * * * source /home/csurbier/selltix_backend/SellTix/tixsellbackend/digitalVarEnv.txt;', 'backoffice.cron.my_scheduled_job')
]
"""
MEDIA_ROOT=os.getenv("APP_HOME")+os.getenv("MEDIA_URL_PREFIX")+'/storage/'
MEDIA_URL = os.getenv('MEDIA_URL_PREFIX')+"/storage/"

#statics

AWS_ACCESS_KEY_ID = os.getenv("CELLAR_ADDON_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.getenv("CELLAR_ADDON_KEY_SECRET")
AWS_STORAGE_BUCKET_NAME = 'selltix'
AWS_S3_ENDPOINT_URL = 'https://'+os.getenv("CELLAR_ADDON_HOST")
AWS_S3_SIGNATURE_VERSION = 's3v4'
AWS_QUERYSTRING_EXPIRE = 11000
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}
AWS_LOCATION = 'static'
AWS_DEFAULT_ACL = 'public-read'
STATIC_ROOT='/static/'
STATIC_URL = '%s/%s/' % (AWS_S3_ENDPOINT_URL, AWS_LOCATION)
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
DEFAULT_FILE_STORAGE = 'tixsell.storage_backend.MediaStorage'  # <-- here is where we reference it
STATICFILES_DIRS = [
    BASE_DIR / "static",
]
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    # 'django.contrib.staticfiles.finders.DefaultStorageFinder',
)
 
SITE_ID = 1


CRISPY_TEMPLATE_PACK = 'bootstrap4'
"""
AUTHENTICATION_BACKENDS = [
'backoffice.helpers.EmailBackend',
#'django.contrib.auth.backends.ModelBackend',
]
"""


X_FRAME_OPTIONS = 'ALLOWALL'
CORS_ORIGIN_ALLOW_ALL=True
CORS_ALLOW_HEADERS = [
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
    'cache-control',
    'pragma',
    'expires'
]

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

ROOT_URLCONF = 'tixsell.urls'
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 30
}

CURRENCIES = ["USD", "EUR", "GBP", "CAD", "AUD"]

 
SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=120), #For test 120 
    'REFRESH_TOKEN_LIFETIME': timedelta(days=180), # days 10
    'ROTATE_REFRESH_TOKENS': True,
    'BLACKLIST_AFTER_ROTATION': True,
    'ALGORITHM': 'HS256',
    'SIGNING_KEY': SECRET_KEY,
    'VERIFYING_KEY': None,
    'AUDIENCE': None,
    'ISSUER': None,

    'AUTH_HEADER_TYPES': ('Bearer',),
    'USER_ID_FIELD': 'id',
    'USER_ID_CLAIM': 'user_id',

    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
    'TOKEN_TYPE_CLAIM': 'token_type',

    'JTI_CLAIM': 'jti',

    'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
    'SLIDING_TOKEN_LIFETIME': timedelta(minutes=30),
    'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=180),
}

DJOSER = {
    'PASSWORD_RESET_CONFIRM_URL': 'account/reset_password_confirm/{uid}/{token}',
    'SEND_ACTIVATION_EMAIL': False,
}

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
       'rest_framework_simplejwt.authentication.JWTAuthentication',
       
    ),
    'DEFAULT_FILTER_BACKENDS': (
        'django_filters.rest_framework.DjangoFilterBackend',
        'rest_framework.filters.OrderingFilter',
      #  'rest_framework_gis.filters.DistanceToPointFilter',
    ),
    'DEFAULT_RENDERER_CLASSES': (
       # 'api.serializers.HashidJSONEncoder',
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ),
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    #'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 20, #nombre impair
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '500/minute',
        'user': '100/second'
    }
}



SWAGGER_SETTINGS = {
   'SECURITY_DEFINITIONS': {
      'Bearer': {
            'type': 'apiKey',
            'name': 'Authorization',
            'in': 'header'
      }
   }
}

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'APP_DIRS': True,
        'DIRS': [
            BASE_DIR,
            os.path.join(BASE_DIR, 'templates')
        ],
        'OPTIONS': {
            'debug': True,
            'context_processors': [
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.template.context_processors.debug',
                    'django.template.context_processors.i18n',
                    'django.template.context_processors.media',
                    'django.template.context_processors.static',
                    'django.template.context_processors.tz',
                    'django.contrib.messages.context_processors.messages',
            ],

        },
    },
]

WSGI_APPLICATION = 'tixsell.wsgi.application'


# Database
# https://docs.tixsell.com/en/4.0/ref/settings/#databases
"""
DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.sqlite3',
         'NAME': os.path.join(BASE_DIR, 'tixsell.sqlite'),
     }
 }

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'tixsell',
        'USER': 'tixsell',
        'PASSWORD': 'tixsell123$',
        'HOST': 'localhost',
        'PORT': '',
        
    }
}
"""
 
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2', #'dj_db_conn_pool.backends.postgresql', #''django.db.backends.postgresql_psycopg2',  #'django.db.backends.mysql',
        'NAME': POSTGRESQL_ADDON_DB,
        'USER': POSTGRESQL_ADDON_USER,
        'PASSWORD': POSTGRESQL_ADDON_PASSWORD,
        'HOST': POSTGRESQL_ADDON_HOST,
        'PORT': POSTGRESQL_ADDON_PORT,
        'CONN_MAX_AGE': 0
    }
}

# Password validation
# https://docs.tixsell.com/en/4.0/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.tixsell.com/en/4.0/topics/i18n/

LANGUAGE_CODE = 'fr-fr'

TIME_ZONE = 'Europe/Paris'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Default primary key field type
# https://docs.tixsell.com/en/4.0/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

# Celery
CELERY_BROKER_URL = os.environ.get('CELERY_BROKER_REDIS_URL', 'redis://:jiLGwl5jeZ2CmCJRVSI@localhost:6379')
 
# this allows you to schedule items in the Django admin.
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ENABLE_UTC = False
CELERY_TIMEZONE = "Europe/Paris"
CELERY_BROKER_POOL_LIMIT = 30
CELERY_BROKER_CONNECTION_TIMEOUT=60
CELERY_BROKER_CONNECTION_MAX_RETRIES=3
CELERY_REDIS_SOCKET_CONNECT_TIMEOUT = 60
CELERY_REDIS_BACKEND_HEALTH_CHECK_INTERVAL=300
CELERY_REDIS_RETRY_ON_TIMEOUT=True
CELERY_TASK_IGNORE_RESULT=True
CELERY_RESULT_CACHE_MAX=-1
CELERY_WORKER_CANCEL_LONG_RUNNING_TASKS_ON_CONNECTION_LOSS=True 

from tixsell.celery import app 
# Periodic Tasks like below
app.conf.beat_schedule = {
    'mint-ticket-every-10-seconds-wallet1': {
        'task': 'backoffice.tasks.mintTicket',
        'schedule': 15.0,
        'args': ('wallet1',)
    },
     'mint-ticket-every-10-seconds-wallet2': {
        'task': 'backoffice.tasks.mintTicket',
        'schedule': 15.0,
        'args': ('wallet2',)
    },
    'mint-ticket-every-10-seconds-wallet3': {
        'task': 'backoffice.tasks.mintTicket',
        'schedule': 15.0,
        'args': ('wallet3',)
    },
    'mint-ticket-every-10-seconds-wallet4': {
        'task': 'backoffice.tasks.mintTicket',
        'schedule': 15.0,
        'args': ('wallet4',)
    },
    'mint-ticket-every-10-seconds-wallet5': {
        'task': 'backoffice.tasks.mintTicket',
        'schedule': 15.0,
        'args': ('wallet5',)
    },
    'check-tasks-every-minutes': {
        'task': 'backoffice.tasks.checkTasks',
        'schedule': 60.0,
        'args': ('',)
    },
    'check-contract-organizer': {
        'task': 'backoffice.tasks.checkContractOrganizer',
        'schedule': 60.0,
        'args': ('',)
    },        
    'check-tasks-every-minutes-eventRappel': {
        'task': 'backoffice.tasks.sendRappelEvent',
        'schedule': 240.0,
        'args': ('',)
    },
    'check-polprice--every-onehour': {
        'task': 'backoffice.tasks.checkPolPrice',
        'schedule': 7200.0,
        'args': ('',)
    },
}
#Logging
U_LOGFILE_SIZE = 200 * 1024 * 1024
U_LOGFILE_COUNT = 7

fileName="django.log"
fileName_stripe="stripe.log"
fileName_transaction="transaction.log"
fileName_nftmonitor="nftmonitor.log"
LOGGER_ROOT=os.getenv("APP_HOME")+os.getenv("STATIC_URL_PREFIX")
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
            'datefmt': "%d/%b/%Y %H:%M:%S"
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'file': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(LOGGER_ROOT, fileName),
            'maxBytes': U_LOGFILE_SIZE,
            'backupCount': U_LOGFILE_COUNT,
            'formatter': 'verbose'
        },
        'file_stripe': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(LOGGER_ROOT, fileName_stripe),
            'maxBytes': U_LOGFILE_SIZE,
            'backupCount': U_LOGFILE_COUNT,
            'formatter': 'verbose'
        },
         'file_transaction': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(LOGGER_ROOT, fileName_transaction),
            'maxBytes': U_LOGFILE_SIZE,
            'backupCount': U_LOGFILE_COUNT,
            'formatter': 'verbose'
        },
        'file_nftmonitor': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(LOGGER_ROOT, fileName_nftmonitor),
            'maxBytes': U_LOGFILE_SIZE,
            'backupCount': U_LOGFILE_COUNT,
            'formatter': 'verbose'
        },
        'error_file': {
            'level': 'ERROR',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(LOGGER_ROOT, 'error.log'),
            'maxBytes': U_LOGFILE_SIZE,
            'backupCount': U_LOGFILE_COUNT,
            'formatter': 'verbose'
        },
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
         'transaction': {
            'handlers': ['file_transaction'],
            'propagate': True,
            'level': 'INFO',
        },
         'stripe': {
            'handlers': ['file_stripe'],
            'propagate': True,
            'level': 'INFO',
        },
        'django': {
            'handlers': ['file', 'error_file'],
            'propagate': True,
            'level': 'INFO',
        },
        'nftmonitor': {
            'handlers': ['file_nftmonitor'],
            'propagate': True,
            'level': 'INFO',
        },
         'django.request': {
            'handlers': ['error_file'],
            'level': 'ERROR',
            'propagate': False,
        },
    }
}
