from flask import Flask,request
from flask_cors import CORS
import os
import environs
from environs import Env
import logging
from flask_mail import Mail,Message
from flask import Flask, render_template, send_from_directory, request, redirect, jsonify, url_for
# from flask_ckfinder3 import CKFinder
from os.path import dirname, join
from flask_wtf.csrf import CSRFProtect


app = Flask(__name__,static_folder='static')
CORS(app)

#Parsing environment variables
env = Env()
env.read_env() 
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))

UPLOAD_PDF = SITE_ROOT + '/media/upload_files'
app.config['UPLOAD_FOLDER'] = UPLOAD_PDF
app.config['SITE_ROOT']=SITE_ROOT
app.config['DOMAIN_NAME']=env("DOMAIN_NAME")
app.config['MEDIA_ROOT'] = SITE_ROOT + '/media'

app.config['MAX_CONTENT_LENGTH'] = 64 * 1024 * 1024


app.secret_key = env("SECRET_KEY")
app.config['ACCUREPAY_PAY_OUT_LIVE_API_KEY'] = env("ACCUREPAY_PAY_OUT_LIVE_API_KEY")
app.config['ACCUREPAY_PAY_OUT_LIVE_SALT'] = env("ACCUREPAY_PAY_OUT_LIVE_SALT")
app.config['ACCUREPAY_PAY_OUT_LIVE_URL'] = env("ACCUREPAY_PAY_OUT_LIVE_URL")
app.config['ACCUREPAY_PAY_IN_LIVE_URL'] = env("ACCUREPAY_PAY_IN_LIVE_URL")

app.config['ACCUREPAY_PAY_OUT_2_LIVE_API_KEY'] = env("ACCUREPAY_PAY_OUT_2_LIVE_API_KEY")
app.config['ACCUREPAY_PAY_OUT_2_LIVE_SALT'] = env("ACCUREPAY_PAY_OUT_2_LIVE_SALT")
app.config['ACCUREPAY_PAY_OUT_2_LIVE_URL'] = env("ACCUREPAY_PAY_OUT_2_LIVE_URL")

app.config['OPENWEATHER_API_KEY'] = env("OPENWEATHER_API_KEY")
app.config['OPENWEATHER_BASE_URL'] = env("OPENWEATHER_BASE_URL")
app.config['IPINFO_ACCESS_TOKEN'] = env("IPINFO_ACCESS_TOKEN")
app.config['PAYPAL_CLIENT_ID'] = env("PAYPAL_CLIENT_ID")
app.config['PAYPAL_CLIENT_SECRET'] = env("PAYPAL_CLIENT_SECRET")
app.config['RECAPTCHA_PUBLIC_KEY'] = env("RECAPTCHA_PUBLIC_KEY")
app.config['RECAPTCHA_PRIVATE_KEY'] = env("RECAPTCHA_PRIVATE_KEY")


#Amazon SES credentials
app.config['EMAIL_SENDER_NAME'] = env("EMAIL_SENDER_NAME")
app.config['SENDER_EMAIL'] = env("SENDER_EMAIL")
app.config['SES_REGION_NAME'] = env("SES_REGION_NAME")
app.config['AWS_ACCESS_KEY_ID'] = env("AWS_ACCESS_KEY_ID")
app.config['AWS_SECRET_ACCESS_KEY'] = env("AWS_SECRET_ACCESS_KEY")

mail = Mail(app)
app.config['MAIL_SERVER']=env('MAIL_SERVER')
app.config['MAIL_PORT'] = env('MAIL_PORT')
app.config['MAIL_USERNAME'] = env('MAIL_USERNAME')
app.config['MAIL_PASSWORD'] =  env('MAIL_PASSWORD')
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USE_SSL'] = False
# app.config['ADMIN_MAIL'] = env('ADMIN_MAIL')
# app.config['ADMIN_NAME'] = env('ADMIN_NAME')
# app.config['MAIL_SEND_FLAG'] = env('MAIL_SEND_FLAG')

#Twilio SMS Credentials
app.config['TWILIO_ACCOUNT_SID'] = env("TWILIO_ACCOUNT_SID")
app.config['TWILIO_AUTH_TOKEN'] = env("TWILIO_AUTH_TOKEN")
app.config['FROM_NUMBER'] = env("FROM_NUMBER")

app.config['SERVER_STATUS'] = env("SERVER_STATUS")
app.config['SERVER_MAINTAINCE_MESSAGE'] = env("SERVER_MAINTAINCE_MESSAGE")

from logging.config import dictConfig
dictConfig({
    'version': 1,
    'formatters': {'default': {
        'format': '[%(asctime)s] %(levelname)s in %(module)s/%(funcName)s: %(message)s',
    }},
    'handlers': {'wsgi': {
        'class': 'logging.StreamHandler',
        'stream': 'ext://flask.logging.wsgi_errors_stream',
        'formatter': 'default'
    }},
    'root': {
        'level': 'INFO',
        'handlers': ['wsgi'] 
    }
})  

    

# @app.route('/')
# def home_page():
#     return render_template('frontend/index.html')
    

@app.route('/robots.txt')
@app.route('/sitemap.xml')
def static_from_root():
    return send_from_directory(app.static_folder, request.path[1:])




upload_dir = UPLOAD_PDF

@app.route('/uploads/<path:filename>')
def uploads(filename):
    return send_from_directory(upload_dir, filename)


################################################## Super Admin Module ################################################

from appservices.superAdmin.controllers.admin import admin
from appservices.superAdmin.controllers.regions import regions
from appservices.superAdmin.controllers.database_migration import database_migration
from appservices.superAdmin.controllers.admin_roles import admin_roles
from appservices.superAdmin.controllers.service_configurations import service_configurations
from appservices.superAdmin.controllers.user_configurations import user_configurations
from appservices.superAdmin.controllers.fee_distribution_setting import fee_distribution_setting
from appservices.superAdmin.controllers.transaction_limit_settings import transaction_limit_settings
from appservices.superAdmin.controllers.settlement import settlement
from appservices.superAdmin.controllers.wallet_master import wallet_master
from appservices.superAdmin.controllers.switch_master import switch_master
from appservices.superAdmin.controllers.tax_master import tax_master
from appservices.superAdmin.controllers.api_master import api_master
from appservices.superAdmin.controllers.bank_masters import bank_masters
from appservices.superAdmin.controllers.kyc_masters import kyc_masters
from appservices.superAdmin.controllers.ticket_master import ticket_master
from appservices.superAdmin.controllers.transaction_report import transaction_report
from appservices.superAdmin.controllers.system_configurations import system_configurations
from appservices.superAdmin.controllers.payment_master import payment_master
from appservices.superAdmin.controllers.plan_master import plan_master
from appservices.superAdmin.controllers.wallet_manage_settlement import wallet_manage_settlement
from appservices.superAdmin.controllers.wallet_manage_payment import wallet_manage_payment
from appservices.superAdmin.controllers.wallet_debit_requests import wallet_debit_requests
from appservices.superAdmin.controllers.user_managements import user_managements
from appservices.superAdmin.controllers.tenant_managements import tenant_managements
from appservices.superAdmin.controllers.profile_masters import profile_masters
from appservices.superAdmin.controllers.wallet_credits_debits import wallet_credits_debits
from appservices.superAdmin.controllers.website_settings import website_settings
from appservices.superAdmin.controllers.registration_master import registration_master
from appservices.superAdmin.controllers.roles import roles
from appservices.superAdmin.controllers.user_commissions import user_commissions
from appservices.superAdmin.controllers.merchant_categories import merchant_categories
from appservices.superAdmin.controllers.patterns_configuarations import patterns_configuarations
from appservices.superAdmin.controllers.merchant_affiliates import merchant_affiliates
from appservices.superAdmin.controllers.staff_members import staff_members
from appservices.superAdmin.controllers.transaction_routings import transaction_routings
from appservices.superAdmin.controllers.admin_reports import admin_reports
from appservices.superAdmin.controllers.api_document_guide import api_document_guide
from appservices.superAdmin.controllers.auto_collects import auto_collects
from appservices.superAdmin.controllers.velocity_rule_engines import velocity_rule_engines
from appservices.superAdmin.controllers.python_crons import python_crons
from appservices.superAdmin.controllers.admin_logs import admin_logs
from appservices.superAdmin.controllers.documents import documents
from appservices.superAdmin.controllers.kyc_apis import kyc_apis
from appservices.superAdmin.controllers.business_documents import business_documents
from appservices.superAdmin.controllers.admin_banners import admin_banners
from appservices.superAdmin.controllers.bank_codes import bank_codes
from appservices.superAdmin.controllers.saikrishnatask import saikrishnatask
from appservices.superAdmin.controllers.downline_list import downline_list
from appservices.superAdmin.controllers.third_party_integrations import third_party_integrations
from appservices.superAdmin.controllers.service_charges import service_charges
from appservices.superAdmin.controllers.sender_mails import sender_mails
from appservices.superAdmin.controllers.sms_apis import sms_apis
from appservices.superAdmin.controllers.products import products
from appservices.superAdmin.controllers.auto_beneficiaries import auto_beneficiaries
from appservices.superAdmin.controllers.gold_master import gold_master
from appservices.superAdmin.controllers.invalid_beneficiaries_list import invalid_beneficiaries_list
from appservices.superAdmin.controllers.invoice_company_details import invoice_company_details
from appservices.superAdmin.controllers.multiple_app_sites import multiple_app_sites
from appservices.superAdmin.controllers.pg_settlements import pg_settlements
from appservices.superAdmin.controllers.mobile_apk_versions import mobile_apk_versions
from appservices.superAdmin.controllers.api_security import api_security
from appservices.superAdmin.controllers.verification_charges import verification_charges
from appservices.superAdmin.controllers.prepaid_mobile_setup import prepaid_mobile_setup
from appservices.superAdmin.controllers.circles_master import circles_master
from appservices.superAdmin.controllers.Prepaid_Operators import Prepaid_Operators
from appservices.superAdmin.controllers.commission_tds_setup import commission_tds_setup
from appservices.superAdmin.controllers.admin_ip_address import admin_ipAddress
from appservices.superAdmin.controllers.gold_buy_transactions import gold_buy_transactions
from appservices.superAdmin.controllers.gold_sell_transactions import gold_sell_transactions
from appservices.superAdmin.controllers.charge_backs import charge_backs








superAdmin_prefix = "/api/super_admin"

app.register_blueprint(admin,url_prefix=superAdmin_prefix)
app.register_blueprint(regions,url_prefix=superAdmin_prefix)
app.register_blueprint(database_migration,url_prefix=superAdmin_prefix)
app.register_blueprint(admin_roles,url_prefix=superAdmin_prefix)
app.register_blueprint(service_configurations,url_prefix=superAdmin_prefix)
app.register_blueprint(user_configurations,url_prefix=superAdmin_prefix)
app.register_blueprint(fee_distribution_setting,url_prefix=superAdmin_prefix)
app.register_blueprint(transaction_limit_settings,url_prefix=superAdmin_prefix)
app.register_blueprint(settlement,url_prefix=superAdmin_prefix)
app.register_blueprint(wallet_master,url_prefix=superAdmin_prefix)
app.register_blueprint(switch_master,url_prefix=superAdmin_prefix)
app.register_blueprint(tax_master,url_prefix=superAdmin_prefix)
app.register_blueprint(api_master,url_prefix=superAdmin_prefix)
app.register_blueprint(bank_masters,url_prefix=superAdmin_prefix)
app.register_blueprint(kyc_masters,url_prefix=superAdmin_prefix)
app.register_blueprint(ticket_master,url_prefix=superAdmin_prefix)
app.register_blueprint(transaction_report,url_prefix=superAdmin_prefix)
app.register_blueprint(system_configurations,url_prefix=superAdmin_prefix)
app.register_blueprint(payment_master,url_prefix=superAdmin_prefix)
app.register_blueprint(plan_master,url_prefix=superAdmin_prefix)
app.register_blueprint(wallet_manage_settlement,url_prefix=superAdmin_prefix)
app.register_blueprint(wallet_manage_payment,url_prefix=superAdmin_prefix)
app.register_blueprint(wallet_debit_requests,url_prefix=superAdmin_prefix)
app.register_blueprint(user_managements,url_prefix=superAdmin_prefix)
app.register_blueprint(tenant_managements,url_prefix=superAdmin_prefix)
app.register_blueprint(profile_masters,url_prefix=superAdmin_prefix)
app.register_blueprint(wallet_credits_debits,url_prefix=superAdmin_prefix)
app.register_blueprint(website_settings,url_prefix=superAdmin_prefix)
app.register_blueprint(registration_master,url_prefix=superAdmin_prefix)
app.register_blueprint(roles,url_prefix=superAdmin_prefix)
app.register_blueprint(user_commissions,url_prefix=superAdmin_prefix)
app.register_blueprint(merchant_categories,url_prefix=superAdmin_prefix)
app.register_blueprint(patterns_configuarations,url_prefix=superAdmin_prefix)
app.register_blueprint(merchant_affiliates,url_prefix=superAdmin_prefix)
app.register_blueprint(staff_members,url_prefix=superAdmin_prefix)
app.register_blueprint(transaction_routings,url_prefix=superAdmin_prefix)
app.register_blueprint(admin_reports,url_prefix=superAdmin_prefix)
app.register_blueprint(api_document_guide,url_prefix=superAdmin_prefix)
app.register_blueprint(auto_collects,url_prefix=superAdmin_prefix)
app.register_blueprint(velocity_rule_engines,url_prefix=superAdmin_prefix)
app.register_blueprint(python_crons,url_prefix=superAdmin_prefix)
app.register_blueprint(admin_logs,url_prefix=superAdmin_prefix)
app.register_blueprint(documents,url_prefix=superAdmin_prefix)
app.register_blueprint(kyc_apis,url_prefix=superAdmin_prefix)
app.register_blueprint(business_documents,url_prefix=superAdmin_prefix)
app.register_blueprint(admin_banners,url_prefix=superAdmin_prefix)
app.register_blueprint(downline_list,url_prefix=superAdmin_prefix)
app.register_blueprint(saikrishnatask,url_prefix=superAdmin_prefix)
app.register_blueprint(third_party_integrations,url_prefix=superAdmin_prefix)
app.register_blueprint(service_charges,url_prefix=superAdmin_prefix)
app.register_blueprint(sms_apis,url_prefix=superAdmin_prefix)
app.register_blueprint(bank_codes,url_prefix=superAdmin_prefix)
app.register_blueprint(sender_mails,url_prefix=superAdmin_prefix)
app.register_blueprint(products,url_prefix=superAdmin_prefix)
app.register_blueprint(auto_beneficiaries,url_prefix=superAdmin_prefix)
app.register_blueprint(gold_master,url_prefix=superAdmin_prefix)
app.register_blueprint(invalid_beneficiaries_list,url_prefix=superAdmin_prefix)
app.register_blueprint(invoice_company_details,url_prefix=superAdmin_prefix)
app.register_blueprint(multiple_app_sites,url_prefix=superAdmin_prefix)
app.register_blueprint(pg_settlements,url_prefix=superAdmin_prefix)
app.register_blueprint(mobile_apk_versions,url_prefix=superAdmin_prefix)
app.register_blueprint(api_security,url_prefix=superAdmin_prefix)
app.register_blueprint(verification_charges,url_prefix=superAdmin_prefix)
app.register_blueprint(prepaid_mobile_setup,url_prefix=superAdmin_prefix)
app.register_blueprint(circles_master,url_prefix=superAdmin_prefix)
app.register_blueprint(Prepaid_Operators,url_prefix=superAdmin_prefix)
app.register_blueprint(commission_tds_setup,url_prefix=superAdmin_prefix)
app.register_blueprint(admin_ipAddress,url_prefix=superAdmin_prefix)
app.register_blueprint(gold_buy_transactions,url_prefix=superAdmin_prefix)
app.register_blueprint(gold_sell_transactions,url_prefix=superAdmin_prefix)
app.register_blueprint(charge_backs,url_prefix=superAdmin_prefix)










################################################## Frontend Module ################################################

from appservices.frontend.controllers.countries import countries
from appservices.frontend.controllers.users import users
from appservices.frontend.controllers.reports import reports
from appservices.frontend.controllers.dmt_transactions import dmt_transactions
from appservices.frontend.controllers.banks import banks
from appservices.frontend.controllers.services import services
from appservices.frontend.controllers.web_hooks import web_hooks
from appservices.frontend.controllers.gold_apis import gold_apis
from appservices.frontend.controllers.aabhibus import aabhibus
# from appservices.frontend.controllers.aabhibus_frontend_apis import aabhibus_frontend_apis

from appservices.frontend.controllers.dailytrackingbalances import dailytrackingbalances
from appservices.frontend.controllers.bbps_frontend_apis import bbps_frontend_apis
# from appservices.frontend.controllers.subscribers import subscribers
# from appservices.frontend.controllers.matrimonial_advertisements import matrimonial_advertisements
# from appservices.frontend.controllers.classifieds import classifieds
# from appservices.frontend.controllers.payment_integration import payment_integration

home_page_prefix = "/api/frontend"
app.register_blueprint(countries,url_prefix=home_page_prefix)
app.register_blueprint(users,url_prefix=home_page_prefix)
app.register_blueprint(reports,url_prefix=home_page_prefix)
app.register_blueprint(dmt_transactions,url_prefix=home_page_prefix)
app.register_blueprint(banks,url_prefix=home_page_prefix)
app.register_blueprint(services,url_prefix=home_page_prefix)
app.register_blueprint(web_hooks,url_prefix=home_page_prefix)
app.register_blueprint(gold_apis,url_prefix=home_page_prefix)
app.register_blueprint(aabhibus,url_prefix=home_page_prefix)
# app.register_blueprint(aabhibus_frontend_apis,url_prefix=home_page_prefix)

app.register_blueprint(dailytrackingbalances,url_prefix=home_page_prefix)
app.register_blueprint(bbps_frontend_apis,url_prefix=home_page_prefix)
# app.register_blueprint(subscribers,url_prefix=home_page_prefix)
# app.register_blueprint(matrimonial_advertisements,url_prefix=home_page_prefix)
# app.register_blueprint(classifieds,url_prefix=home_page_prefix)
# app.register_blueprint(payment_integration,url_prefix=home_page_prefix)


################################################## Frontend New API's ################################################

from appservices.frontend_apis.controllers.payment_links import payment_links
from appservices.frontend_apis.controllers.payment_buttons import payment_buttons
from appservices.frontend_apis.controllers.reminder_settings import reminder_settings
from appservices.frontend_apis.controllers.payment_transactions import payment_transactions
from appservices.frontend_apis.controllers.merchants import merchants
from appservices.frontend_apis.controllers.contacts import contacts
from appservices.frontend_apis.controllers.payout_links import payout_links
from appservices.frontend_apis.controllers.settings import settings
from appservices.frontend_apis.controllers.paymentgateway_integrations import paymentgateway_integrations
from appservices.frontend_apis.controllers.virtual_accounts import virtual_accounts
from appservices.frontend_apis.controllers.frontend_reports import frontend_reports

home_page_prefix = "/api/mobile"
app.register_blueprint(payment_links,url_prefix=home_page_prefix)
app.register_blueprint(payment_buttons,url_prefix=home_page_prefix)
app.register_blueprint(payment_transactions,url_prefix=home_page_prefix)
app.register_blueprint(merchants,url_prefix=home_page_prefix)
app.register_blueprint(contacts,url_prefix=home_page_prefix)
app.register_blueprint(payout_links,url_prefix=home_page_prefix)
app.register_blueprint(settings,url_prefix=home_page_prefix)
app.register_blueprint(paymentgateway_integrations,url_prefix=home_page_prefix)
app.register_blueprint(virtual_accounts,url_prefix=home_page_prefix)
app.register_blueprint(frontend_reports,url_prefix=home_page_prefix)

################################################## V1 API's ################################################

from appservices.v1.controllers.payin_apis import payin_apis
from appservices.v1.controllers.payout_apis import payout_apis
from appservices.v1.controllers.testing_apis import testing_apis
from appservices.v1.controllers.third_party_apis import third_party_apis


home_page_prefix = "/api/v1"
app.register_blueprint(payin_apis,url_prefix=home_page_prefix)
app.register_blueprint(payout_apis,url_prefix=home_page_prefix)
app.register_blueprint(testing_apis,url_prefix=home_page_prefix)
app.register_blueprint(third_party_apis,url_prefix=home_page_prefix)


from appservices.v1.controllers.webhooks import webhooks
home_page_prefix = "/api/v1/webhooks"
app.register_blueprint(webhooks,url_prefix=home_page_prefix)


from appservices.frontend_apis.controllers.payments import payments

home_page_prefix = "/merchants/"
app.register_blueprint(payments,url_prefix=home_page_prefix)


# from appservices.payment_gateways.controllers.accurepay_payment_gateways import accurepay_payment_gateways
# from appservices.payment_gateways.controllers.payaid_payment_gateways import payaid_payment_gateways
# from appservices.payment_gateways.controllers.wowpe_payment_gateways import wowpe_payment_gateways

# home_page_prefix = "/api/paymentgateways"
# app.register_blueprint(accurepay_payment_gateways,url_prefix=home_page_prefix)
# app.register_blueprint(payaid_payment_gateways,url_prefix=home_page_prefix)
# app.register_blueprint(wowpe_payment_gateways,url_prefix=home_page_prefix)


from appservices.grievance.controllers.admin.adminUser import adminUser
from appservices.grievance.controllers.admin.departments import departments
from appservices.grievance.controllers.admin.grievances import grievances
from appservices.grievance.controllers.admin.departmentUsers import departmentUsers
from appservices.grievance.controllers.department.user import user

grievance_admin = "/grievance/admin"
grievance_department = "/grievance/department"
app.register_blueprint(adminUser,url_prefix=grievance_admin)
app.register_blueprint(departments,url_prefix=grievance_admin)
app.register_blueprint(departmentUsers,url_prefix=grievance_admin)
app.register_blueprint(grievances,url_prefix=grievance_admin)
app.register_blueprint(user,url_prefix=grievance_department)