from fastapi import FastAPI, HTTPException, Request
from pydantic import BaseModel
import subprocess
import json
import logging
import os
import pickle
from typing import Dict, Any

app = FastAPI()

@app.get('/')
def root():
    return {'message': 'Hello World Prod '}

@app.get('/helloProd')
def hello():
    return {'message': 'Hello from FastAPI Prod'}

from model_trainer import train_model, save_model

class RecommendationRequest(BaseModel):
    courses_data: dict
    users_data: dict
    competency_data: dict
    top_rated_courses: list

@app.post("/trainProd/")
async def train_model_api(request: Request):
    try:
        data = await request.json()

        client_id = data.get('client_id')
        courses_data = data.get('courses_data')
        users_data = data.get('users_data')
        competency_data = data.get('competency_data')
        top_rated_courses = data.get('top_rated_courses')

        trained_models = train_model(client_id, courses_data, users_data, competency_data, top_rated_courses)
        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))



from recommendation import get_recommendations

logging.basicConfig(level=logging.DEBUG)

class RecommendationRequest(BaseModel):
    client_id: str
    user_data: dict

@app.post("/recommendationsProd/")
async def get_recommendations_api(request: Request):
    try:
        data = await request.json()
        client_id = data.get('client_id', '')
        user_data = data.get('user_data', {})

        logging.debug(f"Received data - Client ID: {client_id}, User Data: {user_data}")

        recommendations = get_recommendations(client_id, user_data)

        logging.debug(f"Recommendations: {recommendations}")

        return recommendations

    except Exception as e:
        logging.error(f"Error in recommendation API: {e}")
        raise HTTPException(status_code=500, detail=str(e))
