from http.client import HTTPException
from tempfile import NamedTemporaryFile
import tempfile
import traceback
from typing import List
from fastapi import FastAPI, UploadFile, File, Form, Body
from fastapi.responses import JSONResponse
from langchain.docstore.document import Document
from langchain.text_splitter import RecursiveCharacterTextSplitter
from pydantic import BaseModel
from langchain_community.embeddings import OllamaEmbeddings

import uvicorn
#from moviepy.editor import VideoFileClip
#from pydub import AudioSegment
#from fastapi.datastructures import UploadFile
from fastapi import HTTPException
from io import BytesIO
import subprocess
import os
import asyncio
import requests
GROQ_API_KEY = "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"
app = FastAPI()
from skill_map import generate_skill_tree,generate_skill_tree_new_skills_with_db,description_skill
from jobProfile_map import map_skills_to_jobProfile,map_skills_to_jobProfile_non_empty
from typing import Any, Dict
import json
@app.get('/helloEdurigoSkillMapTesting')
def hello():
    return {'message': 'Hello from edurigo_ai skill map testing env 8401'}


class SkillTreeRequest(BaseModel):
    prompt_text: str
    groq_api_key: str ="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"
    model_name: str = "mixtral-8x7b-32768"
    temperature: int = 0

@app.post("/generate-skill-tree")
async def generate_skill_tree_endpoint(industry:str =  Form(...),prompt:str =  Form(...),skill_data:str =  Form(...), GPU:int =  Form(...)):
    if skill_data=='Empty':
        skill_tree,token_count  = generate_skill_tree(industry,prompt, GPU )
        #skill_tree,token_count  = generate_skill_tree_new_skills_with_db(prompt_text=industry,skills_db=skill_data, groq_api_key=GROQ_API_KEY)
        return {"skill_tree":skill_tree,"token_count": token_count}
    else:
        #skill_tree,token_count  = generate_skill_tree_new_skills_with_db(industry,prompt, GPU ,skills_db=skill_data)
        #skill_tree,token_count  = generate_skill_tree(prompt_text=industry, groq_api_key=GROQ_API_KEY)
        #return {"skill_tree":skill_tree,"token_count": token_count}
        skill_tree,token_count  = generate_skill_tree_new_skills_with_db(industry,prompt ,skill_data, GPU)
        return {"skill_tree":skill_tree,"token_count": token_count}

@app.post("/skill-description")
async def description_skill_endpoint(industry:str =  Form(...)):
    
    try:
        skill_tree, token_count = description_skill(
            industry=industry,
            groq_api_key=GROQ_API_KEY
        )
        return {"skill_tree": skill_tree, "token_count": token_count}
    except Exception as e:
        return {"error": str(e)}
    

@app.post("/map-jobProfile-skill")
async def map_skills_to_designations_endpoint(skills:str =  Form(...),
                                              jobProfiles:str =  Form(...),
                                              nameDescription:str =  Form(...)):
    
    
    try:
        job_profiles_data = json.loads(nameDescription)
    except json.JSONDecodeError:
        return {"error": "Invalid JSON format for nameDescription"}
    try:
        skill_tree, token_count = map_skills_to_jobProfile(
            skills_db=skills,
            job_profiles_data=job_profiles_data    
        )
        return {"skill_tree": skill_tree, "token_count": token_count}
    except Exception as e:
        return {"error": str(e)}
    


@app.post("/map-jobProfiles-skill-test")
async def map_skills_to_designations_non_empty_endpoint(skills:str =  Form(...),
                                                        jobProfiles:str =  Form(...),
                                                        mapped:str =  Form(...),
                                                        nameDescription:str =  Form(...) ):
    
    # return mapped
    try:
        job_profiles_data = json.loads(nameDescription)
    except json.JSONDecodeError:
        return {"error": "Invalid JSON format for nameDescription"}
    try:
        skill_tree, token_count = map_skills_to_jobProfile_non_empty(
            skills_db=skills,
            mapped_skills = mapped,
            job_profiles_data=job_profiles_data
        )   
        return {"skill_tree": skill_tree, "token_count": token_count}
    except Exception as e:
        return {"error": str(e)}
   
    


# def generate_skill_tree_endpoint(industry: str = Form(...)):
#     """
#     FastAPI endpoint to generate a skill tree for a given industry.

#     Args:
#         industry (str): Industry name received as form data.

#     Returns:
#         SkillTreeResponse: Response containing the generated skill tree.
#     """
#     GROQ_API_KEY = "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"  # Replace with your actual Groq API key

#     try:
#         skill_tree = generate_skill_tree(prompt_text=industry, groq_api_key=GROQ_API_KEY)
#         # Parse the string response to a dictionary
#         if isinstance(skill_tree, str):
#             skill_tree = json.loads(skill_tree)

#         # Validate that the result is a dictionary
#         if not isinstance(skill_tree, dict):
#             raise ValueError("Generated skill tree is not a valid dictionary.")

#         return SkillTreeResponse(skill_tree=skill_tree)
#     except Exception as e:
#         raise HTTPException(status_code=500, detail=f"Error generating skill tree: {str(e)}")