# ollama/chat-ollama/src/__init__.py
import os
from flask import Flask
from flask_login import LoginManager
from .extensions import db
from .models import User 
from .routes import init_app as init_routes_main 
from .config import config
from flask_migrate import Migrate
from .config.database import init_db as init_database 

def create_app(config_name='default'):
    template_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates')
    app = Flask(__name__, template_folder=template_dir)
    from flask import send_from_directory, abort
    @app.route('/assets/<path:filename>')
    def serve_assets(filename):
        assets_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../ditto-ai/dist/assets'))
        norm_filename = filename.replace("\\", "/")
        assets_path = os.path.join(assets_dir, norm_filename)
        print(f"[ASSETS DEBUG] Requested: {filename}")
        print(f"[ASSETS DEBUG] Normalized: {norm_filename}")
        print(f"[ASSETS DEBUG] Full path: {assets_path}")
        print(f"[ASSETS DEBUG] Directory listing: {os.listdir(assets_dir)}")
        if os.path.exists(assets_path):
            print(f"[ASSETS DEBUG] FOUND: {assets_path}")
            return send_from_directory(assets_dir, norm_filename)
        for ext in [".js", ".css", ".png", ".svg"]:
            alt_path = os.path.join(assets_dir, norm_filename + ext)
            if os.path.exists(alt_path):
                print(f"[ASSETS DEBUG] Fallback FOUND: {alt_path}")
                return send_from_directory(assets_dir, norm_filename + ext)
        print(f"[ASSETS DEBUG] NOT FOUND: {assets_path}")
        abort(404)
    
    app.config.from_object(config[config_name])
    if not app.config.get('SQLALCHEMY_DATABASE_URI'):
        app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
        print("AVISO: SQLALCHEMY_DATABASE_URI não estava definido. Usando SQLite padrão: app.db")
    
    if 'UPLOAD_FOLDER' in app.config:
        os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
    else:
        default_upload_folder = os.path.join(app.instance_path, 'uploads')
        os.makedirs(default_upload_folder, exist_ok=True)
        app.config['UPLOAD_FOLDER'] = default_upload_folder
        print(f"AVISO: 'UPLOAD_FOLDER' não estava definido na configuração. Usando padrão: {default_upload_folder}")

    db.init_app(app)
    
    with app.app_context():
        init_database(app)
    
    migrate = Migrate()
    migrate.init_app(app, db)
    
    login_manager = LoginManager()
    login_manager.init_app(app)
    login_manager.login_view = 'auth.login'
    
    @login_manager.user_loader
    def load_user(user_id):
        return User.query.get(int(user_id))
    
    init_routes_main(app)
    
    from flask import render_template, jsonify, request
    
    @app.errorhandler(404)
    def not_found_error(error):
        if request.path.startswith('/api/') or request.path.startswith('/agente/api/'):
            return jsonify({'error': 'Recurso não encontrado'}), 404
        return render_template('error.html', error='Página não encontrada'), 404
    
    @app.errorhandler(500)
    def internal_error(error):
        db.session.rollback() 
        if request.path.startswith('/api/') or request.path.startswith('/agente/api/'):
            return jsonify({'error': 'Erro interno do servidor'}), 500
        return render_template('error.html', error='Ocorreu um erro interno. Tente novamente mais tarde.'), 500
    
    @app.errorhandler(403)
    def forbidden_error(error):
        if request.path.startswith('/api/') or request.path.startswith('/agente/api/'):
            return jsonify({'error': 'Acesso negado'}), 403
        return render_template('error.html', error='Você não tem permissão para acessar este recurso'), 403
    
    @app.errorhandler(Exception)
    def handle_exception(error):
        app.logger.error(f'Erro não tratado: {str(error)}', exc_info=True)
        
        if request.path.startswith('/api/') or request.path.startswith('/agente/api/') or request.headers.get('Content-Type') == 'application/json':
            return jsonify({'error': 'Ocorreu um erro inesperado'}), 500
        
        return render_template('error.html', error='Ocorreu um erro inesperado. Tente novamente mais tarde.'), 500
    
    return app