from fastapi import APIRouter, Depends, HTTPException
from motor.motor_asyncio import AsyncIOMotorDatabase
from app.api import deps
from app.db.session import get_db
from app.models.schemas import User, Enrollment, Course, Module, Lesson
from typing import List
import uuid
import hashlib
from datetime import datetime, timezone

router = APIRouter()

@router.get("", response_model=List[Course])
async def get_courses():
    courses = [
        Course(
            id="foundation-cybersecurity",
            title="Foundation Level Cybersecurity",
            description="12-week comprehensive introduction to cybersecurity fundamentals",
            level="foundation",
            duration_weeks=12,
            modules=[
                Module(
                    name="Information Security Fundamentals", 
                    duration="4 hours",
                    lessons=[
                        Lesson(
                            title="CIA Triad",
                            video_url="https://www.youtube.com/embed/dQw4w9WgXcQ",
                            slides=[
                                {"title": "The CIA Triad", "content": "The fundamental pillars of cybersecurity.", "image_url": "/api/placeholder/800/450"},
                                {"title": "Confidentiality", "content": "Ensuring only authorized parties access data.", "image_url": "/api/placeholder/800/450"},
                                {"title": "Integrity", "content": "Ensuring data remains accurate and unaltered.", "image_url": "/api/placeholder/800/450"},
                                {"title": "Availability", "content": "Ensuring systems are accessible when needed.", "image_url": "/api/placeholder/800/450"}
                            ],
                            voiceover_script="Welcome to your foundation in cybersecurity. We start with the CIA Triad: Confidentiality, Integrity, and Availability. These three pillars guide every security decision we make.",
                            exercises=[
                                {
                                    "question": "Which pillar is breached if a hacker deletes a database?",
                                    "options": ["Confidentiality", "Integrity", "Availability"],
                                    "correct": 2
                                },
                                {
                                    "question": "Encryption primarily supports which pillar?",
                                    "options": ["Confidentiality", "Integrity", "Availability"],
                                    "correct": 0
                                }
                            ],
                            attachments=[
                                {"name": "CIA Triad Guide", "url": "/attachments/cia_triad.pdf", "type": "pdf"}
                            ]
                        ),
                        Lesson(
                            title="Security Controls",
                            video_url="https://www.youtube.com/embed/dQw4w9WgXcQ",
                            slides=[{"title": "Security Controls", "content": "Administrative, Technical, and Physical."}],
                            voiceover_script="Security controls are the tools and policies we use to defend the CIA Triad.",
                            exercises=[
                                {
                                    "question": "A security guard is what type of control?",
                                    "options": ["Technical", "Physical", "Administrative"],
                                    "correct": 1
                                }
                            ]
                        )
                    ]
                )
            ],
            price=14999.00
        )
    ]
    return courses

@router.post("/payment")
async def dummy_payment(
    *,
    db: AsyncIOMotorDatabase = Depends(get_db),
    data: dict,
    current_user: User = Depends(deps.get_current_user)
):
    import asyncio
    await asyncio.sleep(0.5)
    course_id = data.get("course_id")
    if not course_id:
        raise HTTPException(status_code=400, detail="Course ID required")
    return {"status": "success", "transaction_id": str(uuid.uuid4()), "message": "Payment confirmed"}

@router.get("/{course_id}/certificate")
async def get_course_certificate(
    *,
    db: AsyncIOMotorDatabase = Depends(get_db),
    course_id: str,
    current_user: User = Depends(deps.get_current_user)
):
    enrollment = await db.enrollments.find_one({"user_id": current_user.id, "course_id": course_id})
    if not enrollment:
        raise HTTPException(status_code=403, detail="Not enrolled in this course")
    cert_id = f"CERT-{course_id.upper()[:4]}-{current_user.id[:8]}-{uuid.uuid4().hex[:6]}".upper()
    return {
        "certificate_id": cert_id,
        "username": current_user.username,
        "course_title": "Cyber Awareness Course",
        "issue_date": datetime.now(timezone.utc).strftime("%B %d, %Y"),
        "authorized_by": "Trainings24x7 Education Board",
        "signature_url": "/api/placeholder/150/50",
        "logo_url": "/api/placeholder/100/100",
        "verification_hash": hashlib.sha256(f"{cert_id}{current_user.email}".encode()).hexdigest()
    }

@router.post("/{course_id}/enroll")
async def enroll_in_course(
    *,
    db: AsyncIOMotorDatabase = Depends(get_db),
    course_id: str,
    current_user: User = Depends(deps.get_current_user)
):
    existing_enrollment = await db.enrollments.find_one({"user_id": current_user.id, "course_id": course_id})
    if existing_enrollment: raise HTTPException(status_code=400, detail="Already enrolled in this course")
    enrollment = Enrollment(user_id=current_user.id, course_id=course_id)
    await db.enrollments.insert_one(enrollment.dict())
    await db.users.update_one({"id": current_user.id}, {"$addToSet": {"courses_enrolled": course_id}})
    return {"message": "Successfully enrolled in course", "enrollment": enrollment.dict()}

@router.get("/my-enrollments", response_model=List[dict])
async def get_my_enrollments(
    db: AsyncIOMotorDatabase = Depends(get_db),
    current_user: User = Depends(deps.get_current_user)
):
    results = await db.enrollments.find({"user_id": current_user.id}).to_list(length=100)
    for item in results:
        item["id"] = str(item.get("_id", item.get("id")))
        if "_id" in item: del item["_id"]
    return results
