import re
from fastapi import APIRouter, Depends, HTTPException, status
from fastapi.responses import JSONResponse
from fastapi.security import HTTPAuthorizationCredentials,HTTPBearer
from sqlalchemy.orm import Session
from core.security import verify_token
from db.models.user_course_log import UserCourseLog
from db.models.user import User
from db.schemas.user_course_log import UserCourseLogCreate, UserCourseLogUpdate, UserCourseLogResponse
from db.session import get_db
from fastapi.encoders import jsonable_encoder


router = APIRouter()
security = HTTPBearer()

@router.post("/user-course-logs", response_model=UserCourseLogResponse)
async def create_user_course_log(
    user_course_log: UserCourseLogCreate,
    db: Session = Depends(get_db), 
    credentials: HTTPAuthorizationCredentials = Depends(security)
):
    """
    Create a new user course log.
    """
    token = credentials.credentials
    user_id = verify_token(token)

    user = db.query(User).filter(User.id == user_id).first()
    if not user:
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid user token")

    # user_course_log.user_id = user_id
    # db_user_course_log = db.query(UserCourseLog).filter(UserCourseLog.user_id == user_id).first()
    # if db_user_course_log:
    #     raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="User course log already exists")

    db_user_course_log = UserCourseLog(**user_course_log.dict())
    db_user_course_log.type = "Credit"
    db.add(db_user_course_log)
    db.commit()
    db.refresh(db_user_course_log)
    
    return JSONResponse(
        content={
            'user_course_log': jsonable_encoder(UserCourseLogResponse.from_orm(db_user_course_log)),
            'status_code': status.HTTP_201_CREATED,
            'message': 'User course log created successfully'
        }, 
        status_code=status.HTTP_201_CREATED
    )

@router.get("/user-course-logs/{user_id}", response_model=UserCourseLogResponse)
async def get_user_course_log_by_id(
    user_id: int,
    db: Session = Depends(get_db), 
    credentials: HTTPAuthorizationCredentials = Depends(security)
):
    """
    Retrieve a user course log by ID.
    """
    token = credentials.credentials
    login_user_id = verify_token(token)

    user = db.query(User).filter(User.id == login_user_id).first()
    if not user:
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid user token")
    
    user_course_log = db.query(UserCourseLog).filter(UserCourseLog.user_id == user_id).order_by(UserCourseLog.id.desc()).all()
    if not user_course_log:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="User course log not found")
    print(jsonable_encoder(user_course_log),"user_course_log")
    return JSONResponse(
        content={
            'user_course_log': jsonable_encoder(user_course_log),
            'status_code': status.HTTP_200_OK,
            'message': 'User course log retrieved successfully'
        }, 
        status_code=status.HTTP_200_OK
    )

@router.put("/user-course-logs/{user_course_log_id}", response_model=UserCourseLogResponse)    
async def update_user_course_log(
    user_course_log_id: int,
    user_course_log: UserCourseLogUpdate,
    db: Session = Depends(get_db), 
    credentials: HTTPAuthorizationCredentials = Depends(security)
):
    """
    Update a user course log.
    """
    token = credentials.credentials
    user_id = verify_token(token)

    user = db.query(User).filter(User.id == user_id).first()
    if not user:
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid user token")
    
    user_course_log = db.query(UserCourseLog).filter(UserCourseLog.id == user_course_log_id).first()
    if not user_course_log:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="User course log not found")
    
    try:
        user_course_log.number_of_course = user_course_log.number_of_course
        db.commit()
        db.refresh(user_course_log)
        return JSONResponse(
            content={
                'user_course_log': jsonable_encoder(UserCourseLogResponse.from_orm(user_course_log)),
                'status_code': status.HTTP_200_OK,
                'message': 'User course log updated successfully'
            }, 
            status_code=status.HTTP_200_OK
        )    
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Something went wrong: {str(e)}")      





   