

import datetime
from data_scraper.utils import translate_text_by_google
from developer.models import Developer, DeveloperTranslate
from development.models import DevelopmentTranslate
from main.models import Language
import textwrap
from django.db.models import Q, Count
from openai import OpenAI
import environ

from main.utils import log_func
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 translate_developer():
    languages = Language.objects.exclude(code="en")
    base_language = Language.objects.get(code="en")
    for developer in Developer.objects.annotate(tr_num=Count('translates')).filter(Q(translated=False) | Q(tr_num__lt=languages.count()+1))[:10]:
        try: l = developer.translates.get(language=base_language)
        except: l = DeveloperTranslate.objects.create(developer=developer, language=base_language, name=developer.name, slug=developer.slug)
        if l is not None:
            try:
                name = l.name
                slug = l.slug
                description = l.description
                error = False
                for language in languages:
                    t_name = None
                    t_slug = None
                    t_description = None
                    if name is not None: t_name = translate_text_by_google(name, to_language=language.code)
                    if slug is not None: t_slug = translate_text_by_google(slug, to_language=language.code)
                    if description is not None and description != "":
                        lines = []
                        try: lines = textwrap.wrap(description, 300, break_long_words=False)
                        except Exception as e: print("description", e)
                        des = []
                        for line in lines:
                            if line is not None: des.append(translate_text_by_google(line, to_language=language.code))
                        t_description = " ".join(des)
                    
                    try: 
                        try: developer_t = DeveloperTranslate.objects.get(language=language, developer=developer)
                        except: developer_t = DeveloperTranslate(language=language, developer=developer)
                        developer_t.name=t_name
                        developer_t.slug=t_slug
                        developer_t.description=t_description
                        developer_t.save()
                        DevelopmentTranslate.objects.filter(development__developer=developer, language=language).update(developer=developer_t)
                    except Exception as e: 
                        error = True
                        print(f'error on {datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")} : in developer [{developer.name}:{developer.id}] translate : ', e)
                        
                if not error:
                    developer.translated = True
                    developer.save()
            except Exception as e:
                print(f'error on {datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")} : in developer [{developer.name}:{developer.id}] translate : ', e)
                
                
PARAPHRASE_PROMPT = """Regarding the builder, real estate agency, or property below, that name is {name} and office in {city} city, for which I have provided some descriptions, create a paraphrased text in {language} language with html tags, only the relevant part and without html. If it contains headings, use h3 to h6 tags. Also, this information will be displayed on the Entralon website. Here is the name of the website: [https://entralon.com]
            Original Description: "{text}"
            """
            
def paraphrase_description(text, name, property_in_site, city, language="english", prompt=PARAPHRASE_PROMPT, model="gpt-4o-mini"):
    try:
        client = OpenAI(
            api_key=openai_key,
        )
        prompt = prompt.format(text=text, name=name, property_in_site=property_in_site, city=city, language=language)
        chat = client.chat.completions.create(
            model = model,
            messages = [{"role": "user", "content": prompt}],
            temperature = 0.7
        )
        return {"error": False, "content":chat.choices[0].message.content, "error_txt":None}
    except Exception as e:
        print(f'error on {datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")} : in developer description paraphrase [{name}] error : ', e)
        return {"error": True, "content":None, "error_txt":f"{e}"}
    
def developer_description():
    developers = DeveloperTranslate.objects.filter(is_paraphrased=False, paraphrase_error=False)[:10]
    for developer_t in developers:
        try:
            developer = developer_t.developer
            try: des = developer.translates.filter(language__code="en").first().description
            except: des = None
            if des:
                des = des.replace("html", "").replace("```", "")
                description = paraphrase_description(des, developer_t.developer.name, developer_t.developer.developments.all().count(), developer_t.developer.city.name, developer_t.language.name)
                if description['error']:
                    developer_t.paraphrase_error = True
                    developer_t.error = description["error_txt"]
                    developer_t.save()
                    print(f'error on {datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")} : in developer description paraphrase [{developer_t.name}:{developer_t.id}] error : {description["error_txt"]}')
                elif description['content']:
                    t_description = description['content'].replace("html", "").replace("```", "")
                    developer_t.description = t_description
                    developer_t.is_paraphrased = True
                    developer_t.save()
                else:
                    developer_t.paraphrase_error = True
                    developer_t.save()
                    print(f'error on {datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")} : in developer description paraphrase [{developer_t.name}:{developer_t.id}] error : developer description is None')
        except Exception as e:
            developer_t.paraphrase_error = True
            developer_t.error = f"{e}"
            developer_t.save()
            print(f'error on {datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")} : in developer description paraphrase [{developer_t.name}:{developer_t.id}] error : ', e)