from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.responses import HTMLResponse
from fastapi.responses import StreamingResponse
from fastapi.responses import FileResponse
from fastapi.middleware.cors import CORSMiddleware
from io import StringIO
import os
import uuid
from apscheduler.schedulers.background import BackgroundScheduler

import googletrans
from googletrans import Translator
translator = Translator()
lan = googletrans.LANGUAGES
#print(lan)
keys = list(lan.keys())
vals = list(lan.values())

from pandasai import SmartDataframe
import pandas as pd
from pandasai.llm import OpenAI


secret = os.environ["key"]

app = FastAPI()
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

import base64
from PIL import Image
from io import BytesIO

@app.post("/translator")
async def tra(sentence,lang):
        lang = lang.lower()
        return translator.translate(sentence,dest=keys[vals.index(lang)]).text

def convert_image_to_base64(image_path):
    with Image.open(image_path) as image:
        buffered = BytesIO()
        image.save(buffered, format="PNG")
        img_bytes = buffered.getvalue()
        img_base64 = base64.b64encode(img_bytes)
        img_base64_string = img_base64.decode("utf-8")
    return img_base64_string
    

# # Function to call the endpoint
# def call_my_endpoint():
#     #response = requests.get("http://127.0.0.1:8000/my-endpoint")
#     print(f"Endpoint response: {response.json()}")

# # Configure the scheduler
# scheduler = BackgroundScheduler()
# scheduler.add_job(call_my_endpoint, 'interval', seconds=15)  # Call every 30 seconds
# scheduler.start()

@app.post("/get_image_for_text")
async def get_image_for_text(email,query,file: UploadFile = File(...)):
        print(file.filename)
        file_name = file.filename
        with open(email+file_name, "wb") as file_object:
            file_object.write(file.file.read())
        uuid1 = uuid.uuid1()
        llm = OpenAI(api_token=secret,save_charts=True)

        # Determine the file type and read accordingly
        if file_name.endswith('.csv'):
            df = pd.read_csv(email+file_name)
        elif file_name.endswith('.xls') or file_name.endswith('.xlsx'):
            df = pd.read_excel(email+file_name)
        else:
            return {"error": "Unsupported file type"}
            
        sdf = SmartDataframe(df, config={"llm": llm})
        sdf.chat(query)  

        code_to_exec = "import matplotlib.pyplot as plt\nimport seaborn as sns\n"
        code_to_exec = code_to_exec + sdf.last_code_generated.replace("dfs[0]","dfs")
        code_to_exec = code_to_exec.replace("exports/charts/temp_chart.png",email+file_name+".png")
        code_to_exec = code_to_exec+f"\nplt.savefig('{email+file_name}.png')"
    
        print(code_to_exec)
        local_vars = {'dfs': df}
        
        try:
            exec(code_to_exec, globals(), local_vars)
            print(email+file_name+".png",df.head())
            
            #return FileResponse(email+file_name+".png")
            base64str = convert_image_to_base64(email+file_name+".png")
            
            return {"id":str(uuid1),"image":base64str}
        except Exception as e:
            print(str(e))
            return "try again"