from django.utils.text import slugify
from openai import OpenAI
import environ
import requests
from .models import Keyword, News, NewsTranslate, TitleOfBlog
from main.models import Language
from main.utils import log_func
import io
from bs4 import BeautifulSoup
from django.core.files.images import ImageFile
env = environ.Env()
environ.Env.read_env()

openai_key = env.str('openai_key')
openai_pr_id = env.str('openai_pr_id')
openai_org_id = env.str('openai_org_id')


def add_blog_post():
    BLOG_PROMPT = '''Give me an concise and clear article about the following subject with html tags in {language} language, only the relevant part and without html, head, body and heading tags between h2-h6 and not contain title, which is related to real estate consulting, and if possible, the name Entralon (by https://entralon.com link) will be mentioned as a real estate consultant website.
    {text}
    '''
    t = TitleOfBlog.objects.filter(is_created=False).last()
    if t is None:
        return
    text = t.title
    prompt = t.prompt or BLOG_PROMPT
    language = "english"
    model="gpt-4o-mini"
    blog_title = t.title
    blog_slug = slugify(blog_title)
    blog_text = ""
    blog_keywords = ""
    news, _ = News.objects.get_or_create(title=blog_title, slug=blog_slug)
    news.category=t.category
    news.save()
    error = False
    for blog_language in Language.objects.all():
        client = OpenAI(api_key=openai_key)
        b_slug = blog_slug
        try:
            b_title = blog_title
            
            if blog_language.code != "en":
                chat_title = client.chat.completions.create(
                    model = model,
                    messages = [{"role": "system", "content": "You are an experienced real estate consultant with deep market knowledge."},
                                {"role": "user", "content": f"""translate to {blog_language.name} language: {blog_title}"""}],
                    temperature = 0.7
                )
                b_title = chat_title.choices[0].message.content
                
            else:
                try:
                    client = OpenAI(api_key=openai_key,)
                    response = client.images.generate(
                        model="dall-e-3",
                        prompt=f"""generate an image, which is related to real estate consulting and use real models in image, by following text: 
                        {blog_title}""",
                        size="1792x1024",
                        quality="standard",
                        n=1,
                    )
                    image_url = response.data[0].url
                    image_file_request = requests.get(image_url, timeout=30)
                    if image_file_request.status_code == 200:
                        news.image = ImageFile(io.BytesIO(image_file_request.content), name='foo.png')
                        news.save()
                except Exception as e:
                    print(e)
                b_title = blog_title
            news_translate = None
            try: 
                
                news_translate = NewsTranslate.objects.get(language=blog_language, news=news)
                
                news_translate.title=b_title
                
                news_translate.slug=b_slug
                
                news_translate.save()
                
            except Exception as e:
                try: news_translate = NewsTranslate.objects.create(language=blog_language, news=news, title=b_title, slug=b_slug)
                except Exception as e: print(e)
                
            if news_translate is None:
                continue
            prompt = t.prompt or BLOG_PROMPT
            prompt = prompt.format(text=b_title, language=blog_language.name)
            chat_text = client.chat.completions.create(
                model = model,
                messages = [
                    {"role": "system", "content": "You are an experienced real estate consultant with deep market knowledge."},
                    {"role": "user", "content": prompt}],
                temperature = 0.7
            )
            
            news_translate.description = chat_text.choices[0].message.content
            soup = BeautifulSoup(news_translate.description, 'html.parser')
            news_translate.summary = soup.find_all('p')[0].text
            news_translate.save()
            chat_keyword = client.chat.completions.create(
                model = model,
                messages = [{"role": "system", "content": "You are an experienced real estate consultant with deep market knowledge."},
                            {"role": "user", "content": f"Suggest some keywords for this article in {blog_language.name} language, separated by commas: {news_translate.description}"}],
                temperature = 0.7
            )
            
            blog_keywords = chat_keyword.choices[0].message.content
            for k in blog_keywords.split(","):
                if k:
                    try:
                        k_title = k[:255]
                        k_slug = slugify(k_title)
                        keyword, _ = Keyword.objects.get_or_create(language=blog_language, title=k_title,slug=k_slug)
                        news.keywords.add(keyword)
                        news_translate.keywords.add(keyword)
                    except Exception as e:
                        print(e)
            
        except Exception as e:
            print("error: ", e)
            error = True
    if not error:
        t.is_created = True
        t.save()
        news.is_translated = True
        news.save()