import requests
import os
import json
import uuid
from google.cloud import geminidataanalytics
from google.api_core import exceptions as google_exceptions
from google.oauth2 import service_account

class Agent:
    def __init__(self, property_id:str):
        self.property_id = property_id
        self.base_url = "https://geminidataanalytics.googleapis.com"
        self.gcp_project = os.environ.get("GCP_PROJECT")
        try:
            self.client = geminidataanalytics.DataAgentServiceClient()
        except:
            self.client = geminidataanalytics.DataAgentServiceClient(credentials=service_account.Credentials.from_service_account_info(json.loads(os.environ.get("GOOGLE_APPLICATION_CREDENTIALS"))))
    def create_agent(self, display_name, description, system_instruction):
        agent = geminidataanalytics.DataAgent()
        published_context = geminidataanalytics.Context()
        id = f"a{uuid.uuid4()}"
        agent.name=f"projects/{self.gcp_project}/locations/global/dataAgents/{id}"
        agent.display_name=display_name
        agent.description=description

        #Setup Looker Credential
        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")

        #Setup Looker connection
        datasource_references = geminidataanalytics.DatasourceReferences()
        looker_explore_reference = geminidataanalytics.LookerExploreReference()
        looker_explore_reference.looker_instance_uri = os.environ.get("LOOKERSDK_BASE_URL")
        looker_explore_reference.lookml_model = f"c360_{self.property_id}"
        looker_explore_reference.explore = f"event"
        datasource_references.looker.explore_references = [looker_explore_reference]

        published_context.datasource_references = datasource_references
        published_context.system_instruction = system_instruction

        agent.data_analytics_agent.published_context = published_context

        request = geminidataanalytics.CreateDataAgentRequest(
                parent=f"projects/{self.gcp_project}/locations/global",
                data_agent_id=id,
                data_agent=agent
            )
        
        response = self.client.create_data_agent(request=request)
        
        return True if response else False

    def update_agent(self):
        pass

    def get_agent(self):
        request = geminidataanalytics.ListDataAgentsRequest(
            parent=f"projects/{self.gcp_project}/locations/global",
        )
        response = self.client.list_data_agents(request=request)

        if not response:
            return False

        data_agents = response._response.data_agents
        pack_agent = []
        for agent in data_agents:
            if f"c360_client_{self.property_id}" == str(agent.data_analytics_agent.published_context.datasource_references.looker.explore_references[0].lookml_model):
                pack_agent.append(agent)
        
        #Pack Agent
        pack_return = []
        for agent in pack_agent:
            pack = {
                "agent_id": agent.name,
                "agent_name": agent.display_name,
                "agent_description": agent.description
            }
            pack_return.append(pack)
        return pack_return, pack_agent

    def delete_agent(self):
        pass