from flask import Flask
from flask_smorest import Api
from flask_cors import CORS
import datetime
import os

api = Api()
cors = CORS()

def create_app(config_file):
    app = Flask(__name__)
    app.config.from_object(config_file)
    app.config.update(
        # Cookie settings
        SESSION_COOKIE_SAMESITE='Lax',
        SESSION_COOKIE_SECURE=False,  # True in production
        SESSION_COOKIE_HTTPONLY=True,
        SESSION_COOKIE_DOMAIN=None,  # For local development
        
        # Additional security headers
        PERMANENT_SESSION_LIFETIME=datetime.timedelta(days=1),
        SESSION_REFRESH_EACH_REQUEST=True,
        
        # CORS settings
        CORS_SUPPORTS_CREDENTIALS=True,
        CORS_EXPOSE_HEADERS=['Set-Cookie']
    )
    
    # Initialize CORS with more permissive settings for development
    cors.init_app(
        app, 
        supports_credentials=True,
        expose_headers=['Set-Cookie'],
        origins=[
            "http://localhost:5173",
            "http://localhost:5174",
            "http://localhost:5175" ,
            "https://kisiwa.mutabletech.co.ke",
            "https://management.kisiwa.mutabletech.co.ke",
            "https://timetabling.kisiwa.mutabletech.co.ke",
            "https://timetabling.kisiwa.management.mutabletech.co.ke",
            "https://management.lms.mutabletech.co.ke",
            "https://lms.mutabletech.co.ke"
        ],
        methods=["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"],
        allow_headers=[
            "Content-Type", 
            "Authorization", 
            "X-Requested-With",
            "Cookie",
            "Set-Cookie"
        ]
    )
    
    api.init_app(app)
    
    # Register blueprints
    from src.views.users import user_router
    api.register_blueprint(user_router, url_prefix='/api/v1')

    from src.views.course import course_router
    api.register_blueprint(course_router, url_prefix='/api/v1')

    from src.views.tutor import tutor_router
    api.register_blueprint(tutor_router, url_prefix='/api/v1')

    from src.views.student import student_router
    api.register_blueprint(student_router, url_prefix='/api/v1')

    from src.views.availability import tutor_availability
    api.register_blueprint(tutor_availability, url_prefix='/api/v1')

    from src.views.enrollment import enrollment_router
    api.register_blueprint(enrollment_router, url_prefix='/api/v1')

    from src.views.supervisors import supervisor_router
    api.register_blueprint(supervisor_router, url_prefix='/api/v1')

    from src.views.assignments import assignment_router
    api.register_blueprint(assignment_router, url_prefix='/api/v1')

    from src.views.attendance import attendance_router
    api.register_blueprint(attendance_router, url_prefix='/api/v1')

    from src.views.coursemodule import module_router
    api.register_blueprint(module_router, url_prefix='/api/v1')

    from src.views.timetable import timetable_router
    api.register_blueprint(timetable_router, url_prefix='/api/v1')

    from src.views.teaching_session import session_router
    api.register_blueprint(session_router, url_prefix='/api/v1')

    from src.views.reports import reports_router
    api.register_blueprint(reports_router, url_prefix='/api/v1')

    from src.views.admin import admin_router
    api.register_blueprint(admin_router, url_prefix='/api/v1')

    from src.views.speciality import speciality_bp
    api.register_blueprint(speciality_bp, url_prefix='/api/v1')

    from src.views.academic_session import academic_session_bp
    api.register_blueprint(academic_session_bp, url_prefix='/api/v1')

    from src.views.course_level import course_level_router
    api.register_blueprint(course_level_router, url_prefix='/api/v1')

    from src.views.course_week import course_week_router
    api.register_blueprint(course_week_router, url_prefix='/api/v1')

    from src.views.exam_portfolio import exam_portfolio_router
    api.register_blueprint(exam_portfolio_router, url_prefix='/api/v1')

    from src.views.video import video_router
    api.register_blueprint(video_router, url_prefix='/api/v1')

    from src.views.quiz import quiz_router
    api.register_blueprint(quiz_router, url_prefix='/api/v1')

    from src.views.resources import resource_router
    api.register_blueprint(resource_router, url_prefix='/api/v1')

    from src.views.exam_timetables import exam_timetable_router
    api.register_blueprint(exam_timetable_router, url_prefix='/api/v1')

    from src.views.analytics import analytics
    api.register_blueprint(analytics, url_prefix='/api/v1')

    # Database migrations and monitoring setup
    session_monitoring_initialized = False
    database_migrations_run = False
    migration_in_progress = False

    @app.before_request
    def initialize_system():
        """Initialize database migrations and monitor teaching sessions."""
        nonlocal session_monitoring_initialized, database_migrations_run, migration_in_progress
        
        # Run database migrations first
        if not database_migrations_run and not migration_in_progress:
            migration_in_progress = True
            try:
                from src.migrations.migrations import run_database_migrations
                
                app.logger.info("🔄 Running database migrations...")
                
                # DATABASE_URL should be set in config.py
                # If not set, use the default from config
                if 'DATABASE_URL' not in app.config:
                    app.config['DATABASE_URL'] = 'sqlite:///test.db'
                    app.logger.warning("DATABASE_URL not in config, using default: test.db")
                
                success = run_database_migrations()
                if success:
                    app.logger.info("✅ Database migrations completed successfully")
                else:
                    app.logger.error("❌ Database migrations failed")
                    
                database_migrations_run = True
                    
            except Exception as e:
                app.logger.error(f"❌ Database migration error: {e}")
                database_migrations_run = True  # Prevent retry on error
            finally:
                migration_in_progress = False
        
        # Initialize teaching session monitoring
        if not session_monitoring_initialized:
            try:
                from src.views.teaching_session.session_monitor import TeachingSessionMonitor
                
                app.logger.info("🔔 Initializing teaching session monitoring...")
                monitor = TeachingSessionMonitor(app=app)
                
                # Start the session monitoring
                monitor.start_monitoring()
                
                session_monitoring_initialized = True
                app.logger.info("✅ Teaching session monitoring started successfully")
                    
            except Exception as e:
                app.logger.error(f"❌ Teaching session monitoring error: {e}")
                session_monitoring_initialized = True  # Prevent retry on error
    
    return app