from datetime import datetime, timedelta
import logging

logger = logging.getLogger(__name__)


class GA4Connector:
    """Connect to Google Analytics 4 Data API."""

    def __init__(self, credentials_path, property_id):
        from google.analytics.data_v1beta import BetaAnalyticsDataClient
        from google.oauth2 import service_account

        self.property_id = property_id
        credentials = service_account.Credentials.from_service_account_file(
            credentials_path,
            scopes=["https://www.googleapis.com/auth/analytics.readonly"],
        )
        self.client = BetaAnalyticsDataClient(credentials=credentials)
        self.property_path = f"properties/{property_id}"

    # ------------------------------------------------------------------
    def _run_report(self, dimensions, metrics, days=30):
        """Run a GA4 report."""
        from google.analytics.data_v1beta.types import (
            RunReportRequest,
            Dimension,
            Metric,
            DateRange,
        )

        try:
            request = RunReportRequest(
                property=self.property_path,
                dimensions=[Dimension(name=d) for d in dimensions],
                metrics=[Metric(name=m) for m in metrics],
                date_ranges=[
                    DateRange(
                        start_date=f"{days}daysAgo",
                        end_date="today",
                    )
                ],
                limit=50,
            )
            response = self.client.run_report(request)
            results = []
            for row in response.rows:
                item = {}
                for i, dim in enumerate(dimensions):
                    item[dim] = row.dimension_values[i].value
                for i, met in enumerate(metrics):
                    val = row.metric_values[i].value
                    try:
                        item[met] = round(float(val), 2)
                    except ValueError:
                        item[met] = val
                results.append(item)
            return results
        except Exception as e:
            logger.error(f"GA4 report failed: {e}")
            return []

    # ------------------------------------------------------------------
    def get_overview(self, days=30):
        """Get site overview metrics."""
        from google.analytics.data_v1beta.types import (
            RunReportRequest,
            Metric,
            DateRange,
        )

        try:
            request = RunReportRequest(
                property=self.property_path,
                metrics=[
                    Metric(name="totalUsers"),
                    Metric(name="newUsers"),
                    Metric(name="sessions"),
                    Metric(name="screenPageViews"),
                    Metric(name="bounceRate"),
                    Metric(name="averageSessionDuration"),
                ],
                date_ranges=[DateRange(start_date=f"{days}daysAgo", end_date="today")],
            )
            response = self.client.run_report(request)
            if response.rows:
                row = response.rows[0]
                metric_names = [
                    "totalUsers", "newUsers", "sessions",
                    "screenPageViews", "bounceRate", "averageSessionDuration",
                ]
                result = {}
                for i, name in enumerate(metric_names):
                    val = row.metric_values[i].value
                    try:
                        result[name] = round(float(val), 2)
                    except ValueError:
                        result[name] = val
                return result
            return {}
        except Exception as e:
            logger.error(f"GA4 overview failed: {e}")
            return {}

    # ------------------------------------------------------------------
    def get_traffic_sources(self, days=30):
        """Get traffic sources breakdown."""
        return self._run_report(
            ["sessionSource", "sessionMedium"],
            ["sessions", "totalUsers"],
            days,
        )

    # ------------------------------------------------------------------
    def get_top_pages(self, days=30):
        """Get top pages by pageviews."""
        return self._run_report(
            ["pagePath"],
            ["screenPageViews", "averageSessionDuration"],
            days,
        )

    # ------------------------------------------------------------------
    def get_geo_data(self, days=30):
        """Get geographic data."""
        return self._run_report(
            ["country"],
            ["totalUsers", "sessions"],
            days,
        )
