import os  # Make sure this import is at the top
from flask import Flask, request, jsonify, session
from flask_bcrypt import Bcrypt
from flask_session import Session
from flask_cors import CORS
from dotenv import load_dotenv
from werkzeug.utils import secure_filename
from pymysql import IntegrityError
from config import ApplicationConfig
from models import db, User, Dataset
from topicModelling import perform_topic_modeling
from fileComparison import perform_file_comparison, compare
import gensim
import pickle
import logging
from logging.handlers import RotatingFileHandler

# Load environment variables
load_dotenv()

# Application root directory
BASE_DIR = os.path.abspath(os.path.dirname(__file__))

# Ensure required directories exist
required_dirs = ['files', 'datasets', 'models']
for dir_name in required_dirs:
    dir_path = os.path.join(BASE_DIR, dir_name)
    if not os.path.exists(dir_path):
        os.makedirs(dir_path)  # Create the directory if it doesn't exist

# Initialize Flask app
app = Flask(__name__)
app.config.from_object(ApplicationConfig)

# Flask extensions
bcrypt = Bcrypt(app)
cors = CORS(app, supports_credentials=True)
server_session = Session(app)
db.init_app(app)

# Logging
if not app.debug:
    file_handler = RotatingFileHandler(
        os.path.join(BASE_DIR, 'error.log'), maxBytes=10240, backupCount=10
    )
    file_handler.setLevel(logging.ERROR)
    formatter = logging.Formatter(
        '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
    )
    file_handler.setFormatter(formatter)
    app.logger.addHandler(file_handler)

# Database initialization
with app.app_context():
    db.create_all()

# Routes
@app.route("/@me")
def get_current_user():
    user_id = session.get("user_id")
    if not user_id:
        return jsonify({"error": "Unauthorized"}), 401
    
    user = User.query.filter_by(id=user_id).first()
    return jsonify({"id": user.id, "email": user.email})

@app.route('/health')
def health_check():
    return "App is running!", 200

@app.route('/files')
def get_files():
    folder_path = os.path.join(BASE_DIR, 'files')
    if not os.path.exists(folder_path):
        return jsonify({'error': 'Folder not found'}), 404
    
    files = os.listdir(folder_path)
    return jsonify({'files': files})

@app.route('/datasets')
def get_datasets():
    folder_path = os.path.join(BASE_DIR, 'datasets')
    if not os.path.exists(folder_path):
        return jsonify({'error': 'Folder not found'}), 404
    
    datasets = os.listdir(folder_path)
    return jsonify({'datasets': datasets})

if __name__ == "__main__":
    # Remove this for production
    # app.run(debug=True, port=5001)
    pass
