from flask import Flask
from config import Config
from extensions import db, login_manager
from routes.auth import auth_bp
from routes.admin import admin_bp
from routes.user import user_bp
from datetime import timezone, timedelta

WIB = timezone(timedelta(hours=7))

def create_app():
    app = Flask(__name__)
    app.config.from_object(Config)

    db.init_app(app)
    login_manager.init_app(app)
    login_manager.login_view = 'auth.login'
    login_manager.login_message = 'Silakan login terlebih dahulu.'
    login_manager.login_message_category = 'warning'

    app.register_blueprint(auth_bp, url_prefix='/auth')
    app.register_blueprint(admin_bp, url_prefix='/admin')
    app.register_blueprint(user_bp, url_prefix='/user')

    # Filter Jinja2 untuk konversi UTC → WIB (UTC+7)
    @app.template_filter('wib')
    def wib_filter(dt):
        if dt is None:
            return '-'
        return dt.replace(tzinfo=timezone.utc).astimezone(WIB).strftime('%d/%m/%Y %H:%M')

    @app.route('/')
    def index():
        from flask import redirect, url_for
        return redirect(url_for('auth.login'))

    # Pre-load kedua model saat startup supaya prediksi pertama tidak lambat
    with app.app_context():
        _preload_models()

    return app


def _preload_models():
    import os
    from utils.predictor import _load_nb, _load_bert, NB_DIR, BERT_DIR

    if os.path.exists(os.path.join(NB_DIR, 'nb_model.pkl')):
        try:
            _load_nb()
            print('[SentimenMBG] ✅ Model Naive Bayes berhasil dimuat.')
        except Exception as e:
            print(f'[SentimenMBG] ⚠️  Gagal load Naive Bayes: {e}')
    else:
        print('[SentimenMBG] ⚠️  File Naive Bayes tidak ditemukan, skip.')

    if os.path.exists(BERT_DIR) and os.path.isdir(BERT_DIR):
        try:
            _load_bert()
            print('[SentimenMBG] ✅ Model IndoBERT berhasil dimuat.')
        except Exception as e:
            print(f'[SentimenMBG] ⚠️  Gagal load IndoBERT: {e}')
    else:
        print('[SentimenMBG] ⚠️  Folder IndoBERT tidak ditemukan, skip.')


if __name__ == '__main__':
    app = create_app()
    app.run(debug=True)