print("Spieler mit Details ihrer Achievements:");
db.spieler
  .aggregate([
    {
      $lookup: {
        from: "achievements",
        let: { spielerId: "$_id" },
        pipeline: [
          {
            $match: {
              $expr: {
                $in: ["$$spielerId", "$errungen_von.spieler_id"],
              },
            },
          },
        ],
        as: "erreichte_achievements",
      },
    },
    {
      $project: {
        username: 1,
        gesamtpunktzahl: 1,
        achievements: {
          $map: {
            input: "$erreichte_achievements",
            as: "achievement",
            in: {
              name: "$$achievement.name",
              punktewert: "$$achievement.punktewert",
              schwierigkeit: "$$achievement.schwierigkeit",
            },
          },
        },
      },
    },
  ])
  .forEach(printjson);

print("\nDetailierte Spieleranalyse mit Spiel- und Achievement-Informationen:");
db.spieler
  .aggregate([
    { $unwind: "$spielstatistiken" },

    {
      $lookup: {
        from: "spiele",
        localField: "spielstatistiken.spiel_id",
        foreignField: "_id",
        as: "spiel_details",
      },
    },

    {
      $lookup: {
        from: "achievements",
        let: { spielerId: "$_id" },
        pipeline: [
          {
            $match: {
              $expr: {
                $in: ["$$spielerId", "$errungen_von.spieler_id"],
              },
            },
          },
        ],
        as: "achievements",
      },
    },

    {
      $project: {
        _id: 0,
        spieler: "$username",
        spiel: { $arrayElemAt: ["$spiel_details.spielname", 0] },
        genre: { $arrayElemAt: ["$spiel_details.genre", 0] },
        leistung: {
          siege: "$spielstatistiken.siege",
          niederlagen: "$spielstatistiken.niederlagen",
          k_d_ratio: "$spielstatistiken.k_d_ratio",
          spielzeit: "$spielstatistiken.spielzeit_minuten",
        },
        achievements: {
          anzahl: { $size: "$achievements" },
          gesamtpunkte: { $sum: "$achievements.punktewert" },
          liste: "$achievements.name",
        },
      },
    },

    {
      $match: {
        "leistung.k_d_ratio": { $gt: 1.5 },
      },
    },

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

print("\nSpiel-Achievement-Analyse:");
db.spiele
  .aggregate([
    {
      $lookup: {
        from: "achievements",
        let: { spielId: "$_id" },
        pipeline: [
          {
            $match: {
              $expr: {
                $gt: [{ $size: "$errungen_von" }, 1],
              },
            },
          },
        ],
        as: "spiel_achievements",
      },
    },

    {
      $lookup: {
        from: "spieler",
        let: { spielId: "$_id" },
        pipeline: [
          { $unwind: "$spielstatistiken" },
          {
            $match: {
              $expr: {
                $eq: ["$spielstatistiken.spiel_id", "$$spielId"],
              },
            },
          },
        ],
        as: "spieler_stats",
      },
    },

    {
      $project: {
        spielname: 1,
        genre: 1,
        schwierigkeitsgrad: 1,
        statistiken: {
          aktive_spieler: { $size: "$spieler_stats" },
          durchschnitt_kd: {
            $avg: "$spieler_stats.spielstatistiken.k_d_ratio",
          },
          gesamt_spielzeit: {
            $sum: "$spieler_stats.spielstatistiken.spielzeit_minuten",
          },
          achievements: {
            anzahl: { $size: "$spiel_achievements" },
            schwierigkeitsverteilung: {
              $reduce: {
                input: "$spiel_achievements",
                initialValue: { einfach: 0, mittel: 0, schwer: 0 },
                in: {
                  einfach: {
                    $add: [
                      "$$value.einfach",
                      {
                        $cond: [
                          { $eq: ["$$this.schwierigkeit", "Niedrig"] },
                          1,
                          0,
                        ],
                      },
                    ],
                  },
                  mittel: {
                    $add: [
                      "$$value.mittel",
                      {
                        $cond: [
                          { $eq: ["$$this.schwierigkeit", "Mittel"] },
                          1,
                          0,
                        ],
                      },
                    ],
                  },
                  schwer: {
                    $add: [
                      "$$value.schwer",
                      {
                        $cond: [
                          { $eq: ["$$this.schwierigkeit", "Sehr Hoch"] },
                          1,
                          0,
                        ],
                      },
                    ],
                  },
                },
              },
            },
          },
        },
      },
    },

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