from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.llms import OpenAI

from load_model import call_palm
from calling_apis import google_api_key, openai_api_key

def workout_plan_gen(my_goals:str, fitness_level:str, days:int, hours:int, helth_cosnd:str, routine:str, language='En', model_name='Google Palm 2', creativity='Original')->str:

    """
        Generates a Gym Workout Plan based on user's goal, fiteness_level, days and hours avaliable, his routine and health considiration.

        Parameters:
        
            my_goals (str): Trainee Goal from the Gym Workout.
            fitness_level (str): Level of the trainee Fitness.
            days (int): Avaliable Days.
            hours (int): Avaliable Hours.
            helth_cosnd (str): Health Considiration.
            routine (str): Trainee Routine.
            language (str): the language of the generated content (optional, default value is 'EN').
            creativity (str): Optional Parameter -> Controling the randomness of the model. Default value is Original
            model_name (str): Optional Parameter -> select the LLM model. Default Value is Google Palm 2
            

        Returns:
            workout_plan (str): Generated Workout Plan.
    
    """

    temp = 0

    if creativity == 'Original':
        temp = 0
    elif creativity == 'Balanced':
        temp = 0.25
    elif creativity == 'Creative':
        temp = 0.5
    elif creativity == 'Spirited':
        temp = 0.75
    elif creativity == 'Visionary':
        temp = 1


    if model_name == 'Google Palm 2':
        llm = call_palm(google_api_key, temperature=temp)

    elif model_name == 'GPT-3.5':
        llm = OpenAI(model_name='gpt-3.5-turbo', openai_api_key=openai_api_key, temperature=temp)

    elif model_name == 'GPT-4':
        llm = OpenAI(model_name='gpt-4', openai_api_key=openai_api_key, temperature=temp)


    
    if language == 'En':
        
        workout_plan_prompt = f"""Generate a workout plan with diversity and creative exercises.
    Please note the following details:
    * My Goals: I'm looking to {my_goals}
    * Fitness Level: {fitness_level}.
    * Available Equipment: I have access to a gym with various equipment.
    * Time Commitment: I'm dedicated to working out {days} days a week, and I have {hours} hours a day I can spend during each session.
    * Health Considerations: I'm in the {helth_cosnd}.
    * Preferred Routine: I like to follow {routine} routine.\nWorkout Plan:"""
        workout_plan_promptTemp = PromptTemplate(
        input_variables=["text_input"],
        template="You are a Professional Fitness Trainer:\n{text_input}")
        
    elif language == 'Ar':
        
        workout_plan_prompt = f"""قم بإنشاء خطة تمارين رياضية متنوعة ومبتكرة.
يرجى مراعاة التفاصيل التالية:
* أهدافي: أنا أسعى لـ {my_goals}.
* مستوى اللياقة: {fitness_level}.
* المعدات المتاحة: لدي الوصول إلى صالة ألعاب رياضية بها معدات متنوعة.
* الالتزام الزمني: أنا ملتزم بممارسة التمارين {days} أيام في الأسبوع، ولدي {hours} ساعة يوميًا يمكنني قضائها خلال كل جلسة.
* اعتبارات الصحة: أنا في حالة {helth_cosnd}.
* الروتين المفضل: أحب اتباع الروتين {routine}.\nخطة التمارين:"""
        
        workout_plan_promptTemp = PromptTemplate(
        input_variables=["text_input"],
        template="أنت مدرب لياقة مهني:\n{text_input}")
        
        
    workout_plan_extraction_chain = LLMChain(llm=llm, prompt=workout_plan_promptTemp)
    workout_plan = workout_plan_extraction_chain.run(workout_plan_prompt)
    
    return workout_plan