#!/usr/bin/env python

from __future__ import absolute_import
from __future__ import print_function

from flask import Flask
from flask.cli import with_appcontext
from flask_principal import Principal
from flask_sqlalchemy import SQLAlchemy

import click
import logging
import sendgrid
import traceback

from flask_login import LoginManager
from utils import loggingutils


app = Flask(__name__)
Principal(app)
app.config.from_object("config")
db = SQLAlchemy(app)
# csrf = CSRFProtect(app)

login_manager = LoginManager()
login_manager.init_app(app)

app_logger = loggingutils.LoggingUtils(
    __name__, app.config["LOGGING_LOCATION_APP"]
).logger

### Disable faker debug logs
logging.getLogger("faker.factory").setLevel(logging.ERROR)

sg = sendgrid.SendGridAPIClient(api_key=app.config["SENDGRID_KEY"])

from dostadmin import views
from dostadmin.apis.api_activity_location import api_activity_location_bp
from dostadmin.apis.api_activity_type import api_activity_type_bp

app.register_blueprint(api_activity_location_bp)
app.register_blueprint(api_activity_type_bp)


@click.command(name="db-seed")
@with_appcontext
def db_seed():
    from migrations.seeders.campaign import Campaign

    campaign_seeder = Campaign()
    campaign_seeder.create_campaigns()


app.cli.add_command(db_seed)


def create_message(email_text):
    dost_environment = app.config["SERVER_TYPE"].upper()
    return sendgrid.helpers.mail.Mail(
        from_email=app.config["DEFAULT_FROM_EMAIL"],
        to_emails=app.config["DEFAULT_FROM_EMAIL"],
        subject="[" + dost_environment + "] - Dost Admin unhandled exception occurred!",
        plain_text_content=email_text,
    )


@app.errorhandler(Exception)
def handle_500(e):
    error_tb = traceback.format_exc()
    try:
        resp = sg.send(create_message(error_tb))
        print(resp)
    except Exception as exc:
        print(exc)
    return e
