import json

ga4_data = {
  "dimension_headers": [
    {
      "name": "sessionSourceMedium"
    },
    {
      "name": "country"
    },
    {
      "name": "deviceCategory"
    }
  ],
  "metric_headers": [
    {
      "name": "sessions",
      "type_": "TYPE_INTEGER"
    },
    {
      "name": "newUsers",
      "type_": "TYPE_INTEGER"
    },
    {
      "name": "screenPageViews",
      "type_": "TYPE_INTEGER"
    },
    {
      "name": "averageSessionDuration",
      "type_": "TYPE_SECONDS"
    },
    {
      "name": "conversions",
      "type_": "TYPE_FLOAT"
    }
  ],
  "rows": [
    {
      "dimension_values": [
        {
          "value": "google / organic"
        },
        {
          "value": "United States"
        },
        {
          "value": "desktop"
        }
      ],
      "metric_values": [
        {
          "value": "14"
        },
        {
          "value": "8"
        },
        {
          "value": "33"
        },
        {
          "value": "211.11046464285712"
        },
        {
          "value": "0"
        }
      ]
    },
    {
      "dimension_values": [
        {
          "value": "(direct) / (none)"
        },
        {
          "value": "United States"
        },
        {
          "value": "desktop"
        }
      ],
      "metric_values": [
        {
          "value": "6"
        },
        {
          "value": "6"
        },
        {
          "value": "7"
        },
        {
          "value": "41.271322166666671"
        },
        {
          "value": "0"
        }
      ]
    },
    {
      "dimension_values": [
        {
          "value": "(direct) / (none)"
        },
        {
          "value": "United States"
        },
        {
          "value": "mobile"
        }
      ],
      "metric_values": [
        {
          "value": "4"
        },
        {
          "value": "3"
        },
        {
          "value": "5"
        },
        {
          "value": "55.6856115"
        },
        {
          "value": "0"
        }
      ]
    },
    {
      "dimension_values": [
        {
          "value": "google / organic"
        },
        {
          "value": "United States"
        },
        {
          "value": "mobile"
        }
      ],
      "metric_values": [
        {
          "value": "3"
        },
        {
          "value": "0"
        },
        {
          "value": "5"
        },
        {
          "value": "599.67317333333335"
        },
        {
          "value": "0"
        }
      ]
    },
    {
      "dimension_values": [
        {
          "value": "bing / organic"
        },
        {
          "value": "United States"
        },
        {
          "value": "desktop"
        }
      ],
      "metric_values": [
        {
          "value": "2"
        },
        {
          "value": "0"
        },
        {
          "value": "2"
        },
        {
          "value": "2.395726"
        },
        {
          "value": "0"
        }
      ]
    },
    {
      "dimension_values": [
        {
          "value": "localhost / referral"
        },
        {
          "value": "United States"
        },
        {
          "value": "desktop"
        }
      ],
      "metric_values": [
        {
          "value": "2"
        },
        {
          "value": "0"
        },
        {
          "value": "2"
        },
        {
          "value": "9.020689"
        },
        {
          "value": "0"
        }
      ]
    },
    {
      "dimension_values": [
        {
          "value": "with.blue / referral"
        },
        {
          "value": "United States"
        },
        {
          "value": "desktop"
        }
      ],
      "metric_values": [
        {
          "value": "2"
        },
        {
          "value": "0"
        },
        {
          "value": "2"
        },
        {
          "value": "3.5712945"
        },
        {
          "value": "0"
        }
      ]
    },
    {
      "dimension_values": [
        {
          "value": "(direct) / (none)"
        },
        {
          "value": "Germany"
        },
        {
          "value": "desktop"
        }
      ],
      "metric_values": [
        {
          "value": "1"
        },
        {
          "value": "1"
        },
        {
          "value": "1"
        },
        {
          "value": "28.663679"
        },
        {
          "value": "0"
        }
      ]
    },
    {
      "dimension_values": [
        {
          "value": "google / organic"
        },
        {
          "value": "India"
        },
        {
          "value": "mobile"
        }
      ],
      "metric_values": [
        {
          "value": "1"
        },
        {
          "value": "1"
        },
        {
          "value": "1"
        },
        {
          "value": "6.696365"
        },
        {
          "value": "0"
        }
      ]
    },
    {
      "dimension_values": [
        {
          "value": "movingmountains.com / referral"
        },
        {
          "value": "United States"
        },
        {
          "value": "desktop"
        }
      ],
      "metric_values": [
        {
          "value": "1"
        },
        {
          "value": "1"
        },
        {
          "value": "1"
        },
        {
          "value": "7.040584"
        },
        {
          "value": "0"
        }
      ]
    },
    {
      "dimension_values": [
        {
          "value": "statics.teams.cdn.office.net / referral"
        },
        {
          "value": "United States"
        },
        {
          "value": "desktop"
        }
      ],
      "metric_values": [
        {
          "value": "1"
        },
        {
          "value": "0"
        },
        {
          "value": "3"
        },
        {
          "value": "68.514273"
        },
        {
          "value": "0"
        }
      ]
    },
    {
      "dimension_values": [
        {
          "value": "with.blue / referral"
        },
        {
          "value": "United States"
        },
        {
          "value": "mobile"
        }
      ],
      "metric_values": [
        {
          "value": "1"
        },
        {
          "value": "0"
        },
        {
          "value": "0"
        },
        {
          "value": "6.312654"
        },
        {
          "value": "0"
        }
      ]
    }
  ],
  "row_count": 12,
  "metadata": {
    "currency_code": "USD",
    "time_zone": "America/Denver",
    "data_loss_from_other_row": false,
    "sampling_metadatas": []
  },
  "kind": "analyticsData#runReport",
  "totals": [],
  "maximums": [],
  "minimums": []
}

output_data = {}

if ga4_data and ga4_data.get("rows"):
    # Get dimension and metric headers for easier lookup
    dimension_headers = [header["name"] for header in ga4_data["dimension_headers"]]
    metric_headers = [header["name"] for header in ga4_data["metric_headers"]]

    for row in ga4_data["rows"]:
        dimension_values = [d["value"] for d in row["dimension_values"]]
        metric_values = [m["value"] for m in row["metric_values"]]

        session_source_medium = dimension_values[dimension_headers.index("sessionSourceMedium")]

        if session_source_medium not in output_data:
            output_data[session_source_medium] = {
                "sessions": 0,
                "newUsers": 0,
                "screenPageViews": 0,
                "averageSessionDuration": 0.0,
                "conversions": 0.0,
                "views_per_session": 0.0
            }

        # Aggregate metrics
        output_data[session_source_medium]["sessions"] += int(metric_values[metric_headers.index("sessions")])
        output_data[session_source_medium]["newUsers"] += int(metric_values[metric_headers.index("newUsers")])
        output_data[session_source_medium]["screenPageViews"] += int(metric_values[metric_headers.index("screenPageViews")])
        output_data[session_source_medium]["averageSessionDuration"] += float(metric_values[metric_headers.index("averageSessionDuration")])
        output_data[session_source_medium]["conversions"] += float(metric_values[metric_headers.index("conversions")])

    # Calculate views_per_session for each grouped entry
    for source_medium, metrics in output_data.items():
        if metrics["sessions"] > 0:
            metrics["views_per_session"] = round(metrics["screenPageViews"] / metrics["sessions"], 2)
        else:
            metrics["views_per_session"] = 0.0

print(json.dumps(output_data, indent=2))
