from fastapi import FastAPI, HTTPException, Request
from pydantic import BaseModel
import subprocess
import json
from typing import List, Dict
import logging

from model_trainer import train_model, save_model
from recommendation import get_recommendations

app = FastAPI()

@app.get("/execute-dummy")
async def execute_dummy():
    try:
        # Adjust the path to your actual dummy_code.py location
        result = subprocess.run(['python3', '/var/www/chatrigo.edurigo1.com/get_recommendations/dummy_code.py'], capture_output=True, text=True)
        return {"output": result.stdout}
    except Exception as e:
        return {"error": str(e)}

class RecommendationRequest(BaseModel):
    courses_data: dict
    user_data: dict
    competency_data: dict

""" @app.post("/train/")
async def train_model_api(request: Request):
    try:
        data = await request.json()  # Parse JSON data from request
        courses_data = data['courses_data']
        user_data = data['user_data']
        competency_data = data['competency_data']

        # Assuming train_model and save_model are functions defined elsewhere
        trained_models = train_model(courses_data, user_data, competency_data)
        save_model(trained_models)
        
        return {"message": "Models trained and saved successfully."}
    except Exception as e:
        logging.exception("Failed to train and save models")  
        raise HTTPException(status_code=500, detail=str(e))

class RecommendationRequest(BaseModel):
    client_id: str
    user_data: dict
    
@app.post("/recommendations/")
async def get_recommendations_api(request: Request):
    try:
        data = await request.json()
        client_id = data.get('client_id')
        user_data = data.get('user_data')

        recommendations = get_recommendations(client_id, user_data)

        return recommendations

    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e)) """

""" METHOD FOR GETTING RECOMMENDATIONS FROM RECOMMENDATION_SYSTEM.PY FILE WITH COURSE ID, SCORE, REASON """    

from recommendation_system import get_recommendations

# Define request body model
class RecommendationRequest(BaseModel):
    courses_data: list
    user_data: dict
    competency_data: list

# Define response body model
class RecommendationResponse(BaseModel):
    courseId: int
    score: float
    reason: str

@app.post("/recommendations/")
async def get_recommendations_api(request: Request):
    try:
        data = await request.json()
        print("Received request data:", data)

        # Extract data from request body
        courses_data = data.get('courses_data', [])
        user_data = data.get('user_data', {})
        competency_data = data.get('competency_data', {})

        print("Extracted data:", courses_data, user_data, competency_data)

        # Call the recommendation function
        recommendations = get_recommendations(courses_data, user_data, competency_data)

        print("Recommendations:", recommendations)

        # Prepare response array
        response = []

        # Append each recommendation to the response array
        for recommendation in recommendations:
            response.append({
                'courseId': recommendation['courseId'],
                'score': recommendation['score'],
                'reason': recommendation['reason']
            })

        print("Response:", response)

        return response

    except Exception as e:
        # Handle exceptions
        print("Error:", e)
        raise HTTPException(status_code=500, detail=str(e))
