using System.Collections.Generic;
using System.Linq;
using System.Text;
using EDPlayerJournal.BGS;

namespace EliteBGS.LogGenerator;

public class MissionFormat : LogFormatter {
    public string GenerateLog(Objective objective) {
        Dictionary<string, Dictionary<string, int>> collated = new Dictionary<string, Dictionary<string, int>>();
        StringBuilder output = new StringBuilder();
        int total_influence = 0;

        var missions = objective.EnabledOfType<MissionCompleted>();

        if (missions == null || missions.Count == 0) {
            return "";
        }

        foreach (MissionCompleted m in missions) {
            if (!collated.ContainsKey(m.MissionName)) {
                collated[m.MissionName] = new Dictionary<string, int>();
            }
            if (!collated[m.MissionName].ContainsKey(m.Influence)) {
                collated[m.MissionName][m.Influence] = 0;
            }

            ++collated[m.MissionName][m.Influence];

            total_influence += m.Influence.Length;
        }

        foreach (var mission in collated) {
            if (objective.Faction != null) {
                output.AppendFormat("{0}\n", mission.Key);
            } else {
                output.AppendFormat("{0}\n", mission.Key);
            }
            output.Append("(");
            foreach (var influence in mission.Value.OrderBy(x => x.Key.Length)) {
                output.AppendFormat("Inf{0} x{1}, ", influence.Key, influence.Value);
            }
            output.Remove(output.Length - 2, 2); // remove last ", "
            output.Append(")\n\n");
        }

        var support = objective.EnabledOfType<InfluenceSupport>();
        foreach (InfluenceSupport inf in support) {
            output.Append(inf.ToString());
            output.Append("\n");
            total_influence += inf.Influence.Length;
        }

        if (support.Count() > 0) {
            output.Append("\n");
        }

        if (total_influence > 0) {
            output.AppendFormat("Total Influence: {0}", total_influence);
        }

        return output.ToString().Trim();
    }
}