using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using EliteBGS.LogGenerator;

namespace EliteBGS;

public class DiscordLogGenerator {
    protected List<LogFormatter> formatters = new List<LogFormatter>() {
        new MissionFormat(),
        new FailedMissionFormat(),
        new MurderFormat(),
        new VoucherFormat(),
        new ThargoidFormatter(),
        new CombatZoneFormat(),
        new KillBondsFormat(),
        new CartographicsFormat(),
        new MicroResourcesFormat(),
        new MarketBuyFormat(),
        new CargoSoldFormatter(),
        new VistaGenomicsFormat(),
        new SearchAndRescueFormat(),
    };

    protected virtual string GenerateHeader() {
        return "";
    }

    protected virtual string GenerateFooter() {
        return "\n";
    }

    protected virtual string GenerateObjectiveHeader(Objective objective) {
        StringBuilder log = new StringBuilder();

        string location;

        if (!string.IsNullOrEmpty(objective.System) && !string.IsNullOrEmpty(objective.Faction)) {
            location = string.Format("{0}, {1}", objective.System, objective.Faction);
        } else if (!string.IsNullOrEmpty(objective.System)) {
            location = objective.System;
        } else {
            location = "Unknown Location";
        }

        int legacycount = objective.Transactions
                .Where(x => x.IsLegacy)
                .Count()
                ;

        log.AppendFormat("**Date:** {0}\n", DateTime.Now.ToString("dd/MM/yyyy"));
        log.AppendFormat("**Target:** {0}\n", location);
        if (legacycount > 0) {
            log.AppendFormat("**Warning:** Some actions were performed on ED Legacy");
        }
        log.AppendLine("");
        log.AppendLine("```");

        return log.ToString();
    }

    protected virtual string GenerateObjectiveFooter(Objective objective) {
        return "```\n";
    }

    public virtual string GenerateDiscordLog(Report report) {
        StringBuilder log = new StringBuilder();

        if (report == null) {
            return "";
        }

        var objectives = report.Objectives
            .Where(x => x.IsEnabled && x.Transactions.Count() > 0)
            ;

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

        log.AppendFormat("{0}\n", GenerateHeader());

        foreach (Objective objective in objectives) {
            StringBuilder objlog = new StringBuilder();

            log.AppendFormat("{0}\n", GenerateObjectiveHeader(objective));

            foreach (LogFormatter formatter in formatters) {
                string text = formatter.GenerateLog(objective);
                text = text.Trim();
                if (!string.IsNullOrEmpty(text)) {
                    objlog.AppendFormat("{0}\n\n", text);
                }
            }

            log.AppendFormat("{0}\n", objlog.ToString().Trim());

            log.AppendFormat("{0}\n", GenerateObjectiveFooter(objective));
        }

        log.AppendFormat("{0}\n", GenerateFooter());

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