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


class blog_content_generation:

    '''
    Description:
        This Python class, blog_content_generation, is designed to facilitate the creation of various blog-related content using a language model (LLM). 
        It offers functionalities to generate blog post ideas, descriptions, actual posts, and relevant tags for search engine optimization (SEO).
        
    Class Methods:
        __init__(self, llm)

            Description: Initializes the blog_content_generation class by setting the language model (llm) to be used for content generation.
        
        blog_idea_desc_gen(self, blog)

            Description: Generates SEO-friendly titles and meta descriptions for a given blog post topic.

            Parameters:

                topic: The title or topic of the blog post.
                language (str): Opitonal Parameter -> The language of the model.
                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:
            blog_idea_desc: A list of suggested titles and meta descriptions.
            
        blog_idea_gen(self, topic)

            Description: Creates a list of SEO-friendly blog post ideas with emotional and persuasive titles based on a specific topic.

            Parameters:
                topic: The subject or theme for which blog post ideas are requested.
                language (str): Opitonal Parameter -> The language of the model.
                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:
                blog_idea: A list containing at least 10 suggested blog post ideas.
            
        blog_post_gen(self, topic)

            Description: Generates a blog post on a given topic.

            Parameters:
                topic: The subject or theme for the blog post content.
                language (str): Opitonal Parameter -> The language of the model.
                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:
            blog_post: The generated blog post content.
            
        blog_tags_gen(self, blog)

            Description: Suggests tags for a specific blog post.
            
            Parameters:
                blog: The title or topic of the blog post for which tags are needed.
                language (str): Opitonal Parameter -> The language of the model.
                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:
            blog_tags_desc: A list of suggested tags related to the provided blog post.
    '''


    def blog_idea_desc_gen(self, topic, language='En',creativity='Original', model_name='Google Palm 2'):
        
        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':
            
            blog_idea_desc_prompt = f"Suggest at least 5 SEO-friendly titles and meta descriptions for blog post topic delimeted by three backtick. Use a persuasive and intriguing tone.\n```{topic}```"
            blog_idea_desc_promptTemp = PromptTemplate(
            input_variables=["text_input"],
            template="You are my blogger writter\n\n{text_input}\n\nSEO blog post ideas:")
            
        elif language == 'Ar':
            
            blog_idea_desc_prompt = f"اقترح على الأقل 5 عناوين ووصفات ودية لمحركات البحث (SEO) لمقالة الويب التالية {topic}. استخدم نبرة مقنعة ومثيرة للاهتمام."
            blog_idea_desc_promptTemp = PromptTemplate(
            input_variables=["text_input"],
            template="أنت كاتب مدونتي\n\n{text_input}\n\nأفكار مقالات مدونة حول تحسين محركات البحث:")
            
        blog_idea_desc_extraction_chain = LLMChain(llm=llm, prompt=blog_idea_desc_promptTemp)
        blog_idea_desc = blog_idea_desc_extraction_chain.run(blog_idea_desc_prompt)
        
        return blog_idea_desc

    def blog_idea_gen(self, topic, language='En', creativity='Original', model_name='Google Palm 2'):
    
        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':
            blog_idea_prompt = f"Create a list of at least 10 blog post ideas on the following topic: {topic}. Suggest SEO-Friendly title and use an emotional and persuasive tone in blog post titles."
            blog_idea_promptTemp = PromptTemplate(
            input_variables=["text_input"],
            template="You are my blogger writter\n\n{text_input}\n\nSEO blog post ideas:")
            
        elif language == 'Ar':
            blog_idea_prompt = f"أنشئ قائمة تحتوي على على الأقل 10 أفكار لمقالات في موضوع: {topic}. اقترح عناوين صديقة لمحركات البحث واستخدم نبرة عاطفية ومقنعة في عناوين مقالات البلوج"
            blog_idea_promptTemp = PromptTemplate(
            input_variables=["text_input"],
            template="أنت كاتب مدونتي\n\n{text_input}\n\nأفكار مقالات مدونة تحسين محركات البحث:")
            
        blog_idea_extraction_chain = LLMChain(llm=llm, prompt=blog_idea_promptTemp)
        blog_idea = blog_idea_extraction_chain.run(blog_idea_prompt)
        
        return blog_idea

    def blog_post_gen(self, topic, tone_of_voice='Excited', language='En', creativity='Original', model_name='Google Palm 2'):
        
        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':
            
            blog_post_prompt = f"""Write a well organized and attractive blog Plost about the topic delimited by triple backticks.
            The tone should be {tone_of_voice}.
              ```{topic}```."""
            blog_post_promptTemp = PromptTemplate(
            input_variables=["text_input"],
            template="You are a Professional Content Creator and Blog Writer:\n{text_input}\nBlog Post:")
        
        elif language == 'Ar':
            
            blog_post_prompt = f"اكتب مقالة في المدونة حول {topic}."
            blog_post_promptTemp = PromptTemplate(
            input_variables=["text_input"],
            template="أنت مبدع محترف للمحتوى وكاتب للمدوّنات:\n{text_input}\nمقال المدوّنة:")
        
        blog_post_extraction_chain = LLMChain(llm=llm, prompt=blog_post_promptTemp)
        blog_post = blog_post_extraction_chain.run(blog_post_prompt)
        
        return blog_post
        
    def blog_tags_gen(self, blog, language='En', creativity='Original', model_name='Google Palm 2'):
        
        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':
            
            blog_tags_desc_prompt = f" Suggest at least 5 tags for the following blog post.\n{blog}"
            blog_tags_desc_promptTemp = PromptTemplate(
            input_variables=["text_input"],
            template="You are my blogger writter\n\n{text_input}\n\nSEO blog post ideas:")
            
        elif language == 'Ar':
            blog_tags_desc_prompt = f"اقترح ما لا يقل عن 5 علامات لمنشور المدونة التالي.\n{blog}"
            blog_tags_desc_promptTemp = PromptTemplate(
            input_variables=["text_input"],
            template="أنت كاتب مدونتي\n\n{text_input}\n\nأفكار مقالات مدونة محركات البحث:")
            
        blog_tags_desc_extraction_chain = LLMChain(llm=llm, prompt=blog_tags_desc_promptTemp)
        blog_tags_desc = blog_tags_desc_extraction_chain.run(blog_tags_desc_prompt)
        
        return blog_tags_desc