using EDPlayerJournal.Entries;

namespace EDPlayerJournal.BGS;

internal class MarketSellParser : ITransactionParserPart {
    public void Parse(Entry e, TransactionParserContext context, TransactionParserOptions options, TransactionList transactions) {
        long profit = 0;

        if (context.StationOwner == null) {
            transactions.AddIncomplete(
                new SellCargo(),
                "Could not discern the station owner market sell.",
                e);
            return;
        }

        // Ignore if its a fleet carrier faction.
        if (string.Compare(context.StationOwner, Factions.FleetCarrier, StringComparison.OrdinalIgnoreCase) == 0 &&
            options.IgnoreFleetCarrierFaction) {
            return;
        }

        MarketSellEntry? entry = e as MarketSellEntry;
        if (entry == null) {
            throw new NotImplementedException();
        }

        if (entry.Type == null) {
            throw new InvalidJournalEntryException("market sell contains no cargo type");
        }

        if (context.BuyCost.ContainsKey(entry.Type)) {
            long avg = context.BuyCost[entry.Type];
            profit = (long)entry.TotalSale - (avg * entry.Count);
        }

        transactions.Add(new SellCargo(entry) {
            System = context.CurrentSystem,
            Station = context.CurrentStation,
            Faction = context.StationOwner,
            Profit = profit,
            IsLegacy = context.IsLegacy,
        });
    }
}