from datetime import datetime
from .extensions import db, migrate, login, bcrypt, oauth
import logging
import os
from flask import Flask, redirect, url_for
from .extensions import db, migrate, login, bcrypt, oauth, mail, cache
from .celery import make_celery
from config import Config
import json

def create_app():
    app = Flask(__name__)
    app.config.from_object(Config)

    # Determine the directory where the current file is located
    base_dir = os.path.dirname(os.path.abspath(__file__))

    # Construct the full path to the octCreds.json file
    creds_path = os.path.join(base_dir, 'octCreds.json')
    print(creds_path)

    with open(creds_path) as f:
        secrets = json.load(f)

    oauth.init_app(app)
    google = oauth.register(
        name='google',
        client_id=secrets['web']['client_id'],
        client_secret=secrets['web']['client_secret'],
        server_metadata_url='https://accounts.google.com/.well-known/openid-configuration',
        client_kwargs={
            'scope': 'openid profile email'
        }
    )

    db.init_app(app)
    migrate.init_app(app, db, render_as_batch=True)
    login.init_app(app)
    bcrypt.init_app(app)
    login.init_app(app)
    mail.init_app(app)
    cache.init_app(app)

    with app.app_context():
        from .routes import main as main_bp
        app.register_blueprint(main_bp)
        celery = make_celery(app)
        app.celery = celery




    LOG_DIR = os.getenv('LOG_DIR', 'logs')
    if not os.path.exists(LOG_DIR):
        os.makedirs(LOG_DIR, exist_ok=True)

    logging.basicConfig(level=logging.DEBUG, filename=os.path.join(LOG_DIR, 'app.log'))

#--------------------------------- Begin ----------------------------------------------
#-------------------------  Jinja2 custom filters  ------------------------------------
    def datetimeformat(value, format='%H:%M', timezone_offset=0):
        if value is None:
            return ""
        if isinstance(value, (int, float)):
            adjusted_time = datetime.fromtimestamp(int(value) + int(timezone_offset))
        elif isinstance(value, datetime):
            if format == "date":
                return value.strftime('%m/%d/%Y')
        else:
            adjusted_time = datetime.strptime(value, '%Y-%m-%d %H:%M:%S')

        if format == "day":
            return adjusted_time.strftime('%A')



        return adjusted_time.strftime(format)

    def has_any_role(user, roles):
        return any(user.has_role(role) for role in roles)

    def format_currency(value):
        """
        Format a number as currency.

        :param value: The number to format.
        :return: The formatted currency string.
        """
        return "${:,.2f}".format(value)

    app.jinja_env.filters['currency'] = format_currency
    app.jinja_env.filters['datetimeformat'] = datetimeformat
    app.jinja_env.filters['has_any_role'] = has_any_role


    # ------------------------------------End-----------------------------------------------
    # -------------------------  Jinja2 custom filters  ------------------------------------
    @login.user_loader
    def load_user(id):
        from app.models import User
        print('ID:',User.query.get(id))
        return User.query.get(id)

    @login.unauthorized_handler
    def unauthorized_callback():
        return redirect(url_for('main.login'))

    return app


