From a2feda38ced9915eacfce1148ab81d733be298d6 Mon Sep 17 00:00:00 2001
From: Oleg Agafonov <jaydi85@gmail.com>
Date: Fri, 22 Mar 2019 20:12:06 +0400
Subject: [PATCH] Fixed mtgo deck export (sorting, empty lines);

---
 .../decks/exporter/MtgoDeckExporter.java      | 59 +++++++++++--------
 .../decks/exporter/MtgoDeckExporterTest.java  | 19 +++---
 2 files changed, 46 insertions(+), 32 deletions(-)

diff --git a/Mage/src/main/java/mage/cards/decks/exporter/MtgoDeckExporter.java b/Mage/src/main/java/mage/cards/decks/exporter/MtgoDeckExporter.java
index e6bc6d7083..3ff2af5c67 100644
--- a/Mage/src/main/java/mage/cards/decks/exporter/MtgoDeckExporter.java
+++ b/Mage/src/main/java/mage/cards/decks/exporter/MtgoDeckExporter.java
@@ -6,8 +6,10 @@ import mage.cards.decks.DeckFileFilter;
 
 import javax.swing.filechooser.FileFilter;
 import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
-import java.util.TreeMap;
+import java.util.Map;
 
 public class MtgoDeckExporter extends DeckExporter {
 
@@ -17,33 +19,42 @@ public class MtgoDeckExporter extends DeckExporter {
 
     @Override
     public void writeDeck(PrintWriter out, DeckCardLists deck) {
-        TreeMap<String, Integer> deckCards = toCardMap(deck.getCards());
-        TreeMap<String, Integer> sideboard = toCardMap(deck.getSideboard());
-        deckCards.forEach((name, count) -> {
-            out.print(count);
-            out.print(' ');
-            out.println(name);
-        });
+        Map<String, Integer> amount = new HashMap<>();
+        List<String> deckMain = prepareCardsList(deck.getCards(), amount, "M@");
+        List<String> deckSideboard = prepareCardsList(deck.getSideboard(), amount, "S@");
 
-        out.println();
-        out.println();
-
-        sideboard.forEach((name, count) -> {
-            out.print(count);
-            out.print(' ');
-            out.println(name);
-        });
-
-        out.println();
+        printCards(out, deckMain, amount, "M@");
+        if (deckSideboard.size() > 0) {
+            out.println();
+            printCards(out, deckSideboard, amount, "S@");
+        }
     }
 
-    private TreeMap<String, Integer> toCardMap(List<DeckCardInfo> cards) {
-        TreeMap<String, Integer> counts = new TreeMap<>();
-        for (DeckCardInfo card : cards) {
-            int count = counts.getOrDefault(card.getCardName(), 0) + card.getQuantity();
-            counts.put(card.getCardName(), count);
+    private List<String> prepareCardsList(List<DeckCardInfo> sourceCards, Map<String, Integer> amount, String prefix) {
+        List<String> res = new ArrayList<>();
+        for (DeckCardInfo card : sourceCards) {
+            String code = prefix + card.getCardName();
+            int curAmount = amount.getOrDefault(code, 0);
+            if (curAmount == 0) {
+                res.add(card.getCardName());
+            }
+            amount.put(code, curAmount + card.getQuantity());
         }
-        return counts;
+        return res;
+    }
+
+    private void printCards(PrintWriter out, List<String> deck, Map<String, Integer> amount, String prefix) {
+        if (deck.size() == 0) return;
+
+        boolean firstCard = true;
+        for (String name : deck) {
+            if (!firstCard) out.println();
+            out.print(amount.get(prefix + name));
+            out.print(' ');
+            out.print(name);
+            firstCard = false;
+        }
+        out.println();
     }
 
     @Override
diff --git a/Mage/src/test/java/mage/cards/decks/exporter/MtgoDeckExporterTest.java b/Mage/src/test/java/mage/cards/decks/exporter/MtgoDeckExporterTest.java
index 3e69e753bd..3a6df51748 100644
--- a/Mage/src/test/java/mage/cards/decks/exporter/MtgoDeckExporterTest.java
+++ b/Mage/src/test/java/mage/cards/decks/exporter/MtgoDeckExporterTest.java
@@ -15,18 +15,21 @@ public class MtgoDeckExporterTest {
     public void writeDeck() throws IOException {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         DeckCardLists deck = new DeckCardLists();
-        deck.getCards().add(new DeckCardInfo("Forest", "RNA", "1", 2));
-        deck.getCards().add(new DeckCardInfo("Plains", "RNA", "2", 3));
-        deck.getSideboard().add(new DeckCardInfo("Island", "RNA", "3", 2));
+        deck.getCards().add(new DeckCardInfo("Forest", "1", "RNA", 2));
+        deck.getCards().add(new DeckCardInfo("Plains", "2", "RNA", 3));
+        deck.getCards().add(new DeckCardInfo("Plains", "2", "RNA", 5)); // must combine
+        deck.getCards().add(new DeckCardInfo("Mountain", "3", "RNA", 1));
+        deck.getSideboard().add(new DeckCardInfo("Island", "1", "RNA", 2));
+        deck.getSideboard().add(new DeckCardInfo("Island", "1", "RNA", 5)); // must combine
+        deck.getSideboard().add(new DeckCardInfo("Mountain", "2", "RNA", 3));
         MtgoDeckExporter exporter = new MtgoDeckExporter();
         exporter.writeDeck(baos, deck);
         assertEquals("2 Forest" + System.lineSeparator() +
-                        "3 Plains" + System.lineSeparator() +
+                        "8 Plains" + System.lineSeparator() +
+                        "1 Mountain" + System.lineSeparator() +
                         System.lineSeparator() +
-                        System.lineSeparator() +
-                        "2 Island" + System.lineSeparator() +
-                        System.lineSeparator(),
+                        "7 Island" + System.lineSeparator() +
+                        "3 Mountain" + System.lineSeparator(),
                 baos.toString());
     }
-
 }
\ No newline at end of file