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

namespace EliteBGS.BGS {
    public class DiscordLogGenerator {
        protected List<LogFormatter> formatters = new List<LogFormatter>() {
            new MissionFormat(),
            new FailedMissionFormat(),
            new MurderFormat(),
            new VoucherFormat(),
            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();

            log.AppendFormat("**Date:** {0}\n", DateTime.Now.ToString("dd/MM/yyyy"));
            log.AppendFormat("**Location:** {0}\n", objective.ToShortString());
            log.AppendFormat("**Faction:** {0}\n", objective.Faction);
            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();
            var objectives = report.Objectives
                .Where(x => x.IsEnabled && x.LogEntries.Count() > 0)
                .ToArray()
                ;

            if (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();
        }
    }
}