print("Spielstatistiken aller Spieler:");
db.spieler
  .find({}, { _id: 0, username: 1, spielstatistiken: 1 })
  .forEach(printjson);

print("\nSpieler mit K/D-Ratio über 1.8 in irgendeinem Spiel:");
db.spieler
  .find(
    {
      "spielstatistiken.k_d_ratio": { $gt: 1.8 },
    },
    {
      username: 1,
      spielstatistiken: {
        $filter: {
          input: "$spielstatistiken",
          as: "stat",
          cond: { $gt: ["$$stat.k_d_ratio", 1.8] },
        },
      },
    }
  )
  .forEach(printjson);

print("\nVerflachte Spielerstatistiken:");
db.spieler
  .aggregate([
    { $unwind: "$spielstatistiken" },

    {
      $match: {
        "spielstatistiken.spielzeit_minuten": { $gt: 1000 },
      },
    },

    {
      $project: {
        _id: 0,
        spieler: "$username",
        spiel_id: "$spielstatistiken.spiel_id",
        statistiken: {
          siege: "$spielstatistiken.siege",
          niederlagen: "$spielstatistiken.niederlagen",
          k_d_ratio: "$spielstatistiken.k_d_ratio",
          spielzeit: "$spielstatistiken.spielzeit_minuten",
          letztes_spiel: "$spielstatistiken.letztes_spiel",
        },
      },
    },

    {
      $sort: {
        "statistiken.k_d_ratio": -1,
      },
    },
  ])
  .forEach(printjson);

print("\nDurchschnittliche Statistiken pro Spiel:");
db.spieler
  .aggregate([
    { $unwind: "$spielstatistiken" },

    {
      $group: {
        _id: "$spielstatistiken.spiel_id",
        anzahl_spieler: { $sum: 1 },
        durchschnitt_kd: { $avg: "$spielstatistiken.k_d_ratio" },
        gesamt_spielzeit: { $sum: "$spielstatistiken.spielzeit_minuten" },
        gesamt_siege: { $sum: "$spielstatistiken.siege" },
        gesamt_niederlagen: { $sum: "$spielstatistiken.niederlagen" },
      },
    },

    {
      $lookup: {
        from: "spiele",
        localField: "_id",
        foreignField: "_id",
        as: "spiel_info",
      },
    },

    {
      $project: {
        _id: 0,
        spiel: { $arrayElemAt: ["$spiel_info.spielname", 0] },
        statistiken: {
          spieler: "$anzahl_spieler",
          avg_kd: { $round: ["$durchschnitt_kd", 2] },
          spielzeit_stunden: {
            $round: [{ $divide: ["$gesamt_spielzeit", 60] }, 1],
          },
          siege: "$gesamt_siege",
          niederlagen: "$gesamt_niederlagen",
        },
      },
    },

    {
      $sort: {
        "statistiken.spieler": -1,
      },
    },
  ])
  .forEach(printjson);
