import requests
import os
import json
import uuid
from google.cloud import geminidataanalytics
from google.oauth2 import service_account
from google.api_core import exceptions as google_exceptions
import logging
from ..utils import message_handle
from dotenv import load_dotenv
load_dotenv()

class Conversations:
    def __init__(self, agent, property_id:str):
        self.agent = agent
        self.property_id = property_id
        self.base_url = "https://geminidataanalytics.googleapis.com"
        self.gcp_project = os.environ.get("GCP_PROJECT")
        try:
            self.client = geminidataanalytics.DataChatServiceClient()
        except:
            self.client = geminidataanalytics.DataChatServiceClient(credentials=service_account.Credentials.from_service_account_info(json.loads(os.environ.get("GOOGLE_APPLICATION_CREDENTIALS"))))
        
    def create_conversation(self):
        conversation = geminidataanalytics.Conversation()
        conversation.agents = [self.agent.name]
        request = geminidataanalytics.CreateConversationRequest(
            parent=f"projects/{self.gcp_project}/locations/global",
            conversation=conversation,
        )
        try:
            convo = self.client.create_conversation(request=request)
            return convo
        except google_exceptions.GoogleAPICallError as e:
            logging.error(f"API error creating convo: {e}")
        except Exception as e:
            logging.error(f"Unexpected error: {e}")
        
    def fetch_convos(self):
        try:
            request = geminidataanalytics.ListConversationsRequest(
                parent=f"projects/{self.gcp_project}/locations/global",
                page_size=100,
            )

            convos = list(self.client.list_conversations(request=request))
            convos = [c for c in convos if c.agents[0] == self.agent.name]
            return convos

        except google_exceptions.GoogleAPICallError as e:
            logging.error(f"API error fetching convos: {e}")
        except Exception as e:
            logging.error(f"Unexpected error: {e}")
    
    def fetch_messages(self, convo=None):
        request = geminidataanalytics.ListMessagesRequest(parent=convo.name)
        
        try:
            msgs = list(self.client.list_messages(request=request))
            msgs = [m.message for m in msgs]
            convo_messages = list(reversed(msgs)) if len(msgs) > 0 else []
            
            messageData = []
            for msg in convo_messages:
                if 'system_message' in msg: 
                    pack = {
                        "type": "system_message"
                    }
                    system_message = msg.system_message
                    if 'schema' in system_message:
                        pass
                    elif 'data' in system_message:
                        if "result" in system_message.data:
                            mes = message_handle.handle_data_response(getattr(system_message, 'data'))
                            pack['data'] = mes
                            messageData.append(pack)
                    elif 'chart' in system_message:
                        if "result" in system_message.chart:
                            mes = message_handle.handle_chart_response(getattr(system_message, 'chart'))
                            pack['chart'] = mes
                            messageData.append(pack)
                    elif 'text' in system_message:
                        mes = message_handle.handle_text_response(getattr(system_message, 'text'))
                        pack['message'] = mes
                        messageData.append(pack)
            return messageData, convo_messages
            
        except google_exceptions.GoogleAPICallError as e:
            logging.error(f"API error fetching messages: {e}")
        except Exception as e:
            logging.error(f"Unexpected error: {e}")
    
    def add_message(self, convo=None, user_input=None):
        user_msg = geminidataanalytics.Message(user_message={"text": user_input})
        convo_ref = geminidataanalytics.ConversationReference()
        convo_ref.conversation = convo.name
        convo_ref.data_agent_context.data_agent = self.agent.name
        
        credentials = geminidataanalytics.Credentials()
        credentials.oauth.secret.client_id = os.environ.get("LOOKERSDK_CLIENT_ID")
        credentials.oauth.secret.client_secret = os.environ.get("LOOKERSDK_CLIENT_SECRET")
        convo_ref.data_agent_context.credentials = credentials
        
        request = geminidataanalytics.ChatRequest(
            parent=f"projects/{self.gcp_project}/locations/global",
            messages=[user_msg],
            conversation_reference=convo_ref,
        )
        
        messageData = []

        for msg in self.client.chat(request=request):
            if 'system_message' in msg:
                pack = {
                    "type": "system_message"
                }
                system_message = msg.system_message
                if 'schema' in system_message:
                    pass
                elif 'data' in system_message:
                    if "result" in system_message.data:
                        mes = message_handle.handle_data_response(getattr(system_message, 'data'))
                        pack['data'] = mes
                        messageData.append(pack)
                elif 'chart' in system_message:
                    if "result" in system_message.chart:
                        mes = message_handle.handle_chart_response(getattr(system_message, 'chart'))
                        pack['chart'] = mes
                        messageData.append(pack)
                elif 'text' in system_message:
                    mes = message_handle.handle_text_response(getattr(system_message, 'text'))
                    pack['message'] = mes
                    messageData.append(pack)
        return messageData