from fastapi import FastAPI, Form, HTTPException
from fastapi.responses import JSONResponse
import tempfile
import requests
import json
#from llama3_generate_storigo_content import extract_text_from_pdf, create_embeddings, generate_slide_content
#from llama3_generate_storigo_content import load_pdf,transcribe, load_txt,split_text_with_semantic_chunker,crawlerrr,read_file_url,split_text_with_semantic_chunker_for_url,clean_using_llm,count_total_words,save_documents_to_txt,create_and_save_embeddings,generate_slide_content,merge_all_faiss,parsing, marks_splitter, allocate_slides,create_embeddings,generate_slide_content_alloc1
#from llama3_generate_storigo_content import parsing, marks_splitter, allocate_slides,create_embeddings,generate_slide_content_alloc1
from tna import string_data_to_json, TNA_Goals, find_skill_gaps_goals,recommend_online_courses_goal, recommend_offline_courses_goal,TNA_Problems, find_skill_gaps_problems,recommend_online_courses_problems, recommend_offline_courses_problems,recommend_online_offline_courses_goal,recommend_online_offline_courses_problems
from langchain_community.embeddings import OllamaEmbeddings
import os 
app = FastAPI()
import logging
import traceback

def string_data_to_json(organization_skills: str, course_names: str, course_descriptions: str):
    # Convert organization_skills into a list
    organization_skills_list = [s.strip() for s in organization_skills.split(',')]
    
    # Assuming course_names and course_descriptions are JSON strings, load them
    course_names_list = json.loads(course_names)
    course_descriptions_list = json.loads(course_descriptions)

    # Create list of dictionaries by zipping course_names and course_descriptions
    courses_list = [{"name": name, "description": desc} for name, desc in zip(course_names_list, course_descriptions_list)]

    # Create final JSON structure
    data = {
        "organization_skills": organization_skills_list,
        "courses": courses_list
    }

    return data

def string_data_to_json1(organization_skills: str, course_names: str, course_descriptions: str):
    # Convert organization_skills into a list
    organization_skills_list = [s.strip() for s in organization_skills.split(',')]
    
    # Split course_names and course_descriptions by comma
    course_names_list = [name.strip() for name in course_names.split(',')]
    course_descriptions_list = [desc.strip() for desc in course_descriptions.split(',')]

    # Create list of dictionaries by zipping course_names and course_descriptions
    courses_list = [{"name": name, "description": desc} for name, desc in zip(course_names_list, course_descriptions_list)]

    # Create final JSON structure
    data = {
        "organization_skills": organization_skills_list,
        "courses": courses_list
    }

    return data

def string_data_to_json2(organization_skills: str, course_names: str, course_descriptions: str, course_ids: str):
    # Convert comma-separated strings to lists
    organization_skills_list = [s.strip() for s in organization_skills.split(',')]
    course_names_list = [name.strip() for name in course_names.split(',')]
    course_descriptions_list = [desc.strip() for desc in course_descriptions.split(',')]
    course_ids_list = [cid.strip() for cid in course_ids.split(',')]

    # Zip and create list of course dictionaries
    courses_list = [
        {"name": name, "description": desc, "courseId": cid}
        for name, desc, cid in zip(course_names_list, course_descriptions_list, course_ids_list)
    ]

    # Final data structure
    data = {
        "organization_skills": organization_skills_list,
        "courses": courses_list
    }

    return data   

    
@app.post("/generate-tna")
async def generate_tna(
    #client_id: str = Form(...),
    goals: str = Form(...),
    problems: str = Form(...),
    skills: str = Form(...),
    course_names: str = Form(...),
    course_descriptions: str = Form(...),
    course_ids:str = Form(...)
    
    #isGPU: int = Form(...),
) -> JSONResponse:
    try:
        data = string_data_to_json2(skills, course_names, course_descriptions,course_ids)
        if isinstance(data, str):
            data = json.loads(data)
    
        # Now extract the courses
        course_data = data["courses"]
        # Convert to JSON string for prompt
        course_data_json = json.dumps(course_data, ensure_ascii=False, indent=2)
        
        # with open("DataIb1.json", "r") as f:
        #     data_load = json.load(f)
        #     organization_skills = set(data_load["organization_skills"])
        #     courses_data = data_load["courses"]
        organization_skills = data["organization_skills"]

        
        
        if goals:

            required_skills_goals = TNA_Goals(goals)
            skill_gap_analysis_goals = find_skill_gaps_goals(required_skills_goals, organization_skills)
            
            all_missing_skills_goals = [analysis["missing_skills"] for analysis in skill_gap_analysis_goals.values()]
            # offline_course_goals = recommend_offline_courses_goal(goals, all_missing_skills_goals,course_data_json)
            # oc = offline_course_goals.content
            # offline_course_goals_last = oc.strip("```json").strip("```").strip()
            # online_course_goals = recommend_online_courses_goal(goals, all_missing_skills_goals)
            # oc = online_course_goals.content
            # online_course_goals_last = oc.strip("```json").strip("```").strip()
            courses_goals = recommend_online_offline_courses_goal(goals, all_missing_skills_goals,course_data_json)
            
        
        if problems:
            required_skills_problems = TNA_Problems(problems)
            skill_gap_analysis_problems = find_skill_gaps_problems(required_skills_problems, organization_skills)

            all_missing_skills_problems = [analysis["missing_skills"] for analysis in skill_gap_analysis_problems.values()]
            # offline_course_problems = recommend_offline_courses_problems(problems, all_missing_skills_problems,course_data_json)
            # oc = offline_course_problems.content
            # offline_course_prob_last = oc.strip("```json").strip("```").strip()
            # online_course_problems = recommend_online_courses_problems(problems, all_missing_skills_goals)
            # oc = online_course_problems.content
            # online_course_prob_last = oc.strip("```json").strip("```").strip()
            courses_problems = recommend_online_offline_courses_problems(problems, all_missing_skills_problems,course_data_json)

        if goals and problems:
            return (courses_goals, courses_problems)
        elif not goals:
            return (courses_problems)
        else:
            return (courses_goals)


        




            

            

        


    except Exception as e:
        # Log the actual error for debugging
        logging.error(f"Error generating content: {str(e)}")
        
        # Return a generic error message to the frontend
        # return JSONResponse(
        #     content={"error": "Something went wrong. Please try again later."},
        #     status_code=500
        # )
        return JSONResponse(
        status_code=500,
        content={
            "error": str(e),
            # only include this in dev—remove in prod!
            "trace": traceback.format_exc().splitlines()
        }
    )
    

