import os
from celery import Celery
from typing import List, Dict, Optional
# from dependencies.content_weaver import *
from dependencies.CourseCreator import CourseCreator
from dependencies.awsutils import S3Service
import db_config.database as dbase
from db_config.models import Courses
from sqlalchemy.orm import Session
APP_URL = os.getenv("APP_URL")
S3_DIR = os.getenv("S3_DIR", "Syllabuild_Courses")
celery_app = Celery(
    "tasks",
    broker="redis://localhost:6379/0",  # Redis as message broker
    backend="redis://localhost:6379/0"
)

@celery_app.task(bind=True, acks_late=True)
def process_course_celery(
    self,
    topic: str,
    course_id: str
) -> str:
    db: Session = dbase.SessionLocal()
    try:
        # Fetch document from DB
        self.update_state(state='PROGRESS', meta={'progress': 10})
        course_data = db.query(Courses).filter(Courses.course_id == course_id).first()
        if not course_data:
            return f"Course with ID {course_id} not found."
        
        self.update_state(state='PROGRESS', meta={'progress': 30})

        download_link = f"{APP_URL}/download-imscc?course_id={course_id}"
        try:
            # Generate the course content
            # markdown_content = generate_course_materials(course_data.topic)            
            course_creator = CourseCreator(
                course=course_data
            )
            
            self.update_state(state='PROGRESS', meta={'progress': 60})

            result = course_creator.generate_course_materials()

            self.update_state(state='PROGRESS', meta={'progress': 80})

            # Upload to S3
            base_filename = course_data.topic.replace(" ", "_")
            s3_service = S3Service()
            s3_result = s3_service.upload_object(f"{S3_DIR}/{course_id}", f"{base_filename}.md", result['markdown_content'])
            course_path = s3_result['file_url']
            
            course_data.course_imscc_url = download_link
            course_data.status = "Ready"
            course_data.markdown_content = result['markdown_content']
            course_data.markdown_url = course_path
            course_data.content_description = result['course_description']
            db.commit()
            db.refresh(course_data)
            
            print(f"✅ Course materials generated and saved to {course_path}")
        except Exception as e:
            # Update course status
            course_data.status = "Failed"
            db.commit()
            db.rollback()  # Rollback in case of an error
            return f"Error generating course content: {str(e)}"
        

    except Exception as e:
        db.rollback()  # Rollback in case of an error
        return f"Error processing Course: {str(e)}"

    finally:
        db.close()  # Ensure the session is closed properly

    self.update_state(state='PROGRESS', meta={'progress': 100})
    return "Course processed successfully."