import json
import os
from google.oauth2 import service_account
from google.api_core.exceptions import GoogleAPIError
from google.analytics.data_v1beta import BetaAnalyticsDataClient
from google.analytics.data_v1beta.types import GetMetadataRequest
from google.analytics.admin import AnalyticsAdminServiceClient
from google.analytics.admin import BigQueryLink
from google.analytics.data_v1beta.types import (
    Dimension,
    Metric,
    RunRealtimeReportRequest,
)
from .run_report import print_run_report_response

class GA4:
    def __init__(self, property_id):
        self.clientAdmin = AnalyticsAdminServiceClient(credentials=service_account.Credentials.from_service_account_info(json.loads(os.environ.get("YDM_GA4_SERVICE_ACCOUNT"))))
        self.client = BetaAnalyticsDataClient(credentials=service_account.Credentials.from_service_account_info(json.loads(os.environ.get("YDM_GA4_SERVICE_ACCOUNT"))))
        self.property_id = property_id
        self.big_query_link = BigQueryLink({
            "project": "projects/customer-360-profile",
            "daily_export_enabled": True,
            "streaming_export_enabled": True,
            "fresh_daily_export_enabled": True,
            "include_advertising_id": True,
            "dataset_location": "asia-southeast1"
        })

    def get_user_property_metadata(self, type: str):
        """
        Returns metadata for dimensions that are user properties.

        Args:
            property_id: The numeric GA4 property ID (e.g., '123456789').
        """
        try:
            # name = f"properties/{self.property_id}/metadata"
            property_id = f"properties/{self.property_id}/metadata"
            metadata = self.client.get_metadata(GetMetadataRequest(name=property_id))
            user_properties_found = []
            
            for u in metadata.dimensions:
                if u.category == type:
                    user_properties_found.append({'user_property_name': u.ui_name})
            

            # for dimension in metadata.dimensions:
            #     print(dimension)
            #     if dimension.custom_definition and dimension.custom_definition.scope == type.upper():
            #         user_properties_found.append(dimension)
            
            return user_properties_found
            
        except GoogleAPIError as e:
            print(f"An API error occurred: {e}")
        except Exception as e:
            print(f"An unexpected error occurred: {e}")

    def check_linked_ga4(self):
        linkedBQ = self.clientAdmin.list_big_query_links(parent=f"properties/{self.property_id}")
        if  linkedBQ.__dict__['_response']:
            return linkedBQ.__dict__['_pb'].bigquery_links[0].project.split('/')[1]
        return False
    
    def link_bigquery(self):
        created_link = self.clientAdmin.create_big_query_link(
            parent=f"properties/{self.property_id}",
            bigquery_link=self.big_query_link
            )
        if "_pb" in created_link.__dict__:
            return True
    
    def craftDimension(self, name):
        dimension = Dimension(name=name)
        return dimension
    
    def craftMetrics(self, name):
        metric = Metric(name=name)
        return metric

    def run_realtime_report(self, dimensions:list = [], metrics:list = []):
        """Runs a realtime report on a Google Analytics 4 property."""

        request = RunRealtimeReportRequest(
            property=f"properties/{self.property_id}",
            dimensions=dimensions,
            metrics=metrics,
        )
        response = self.client.run_realtime_report(request)
        print(response)
        print_run_report_response(response)
        
