[LIB-13] Add PGN format classes
[chesshog-scanner.git] / src / main / java / org / hedgecode / chess / scanner / format / PGNTag.java
  * limitations under the License.
  */
 
-package org.hedgecode.chess.scanner.entity;
+package org.hedgecode.chess.scanner.format;
+
+import java.util.Arrays;
+import java.util.Comparator;
 
 /**
  * PGNTag
@@ -26,10 +29,10 @@ public enum PGNTag {
     EVENT         ( "Event",        true,        PGNTag.QUESTION      ),
     SITE          ( "Site",         true,        PGNTag.QUESTION      ),
     DATE          ( "Date",         true,        PGNTag.QUESTION_DATE ),
-    TIME          ( "Time",         false,       PGNTag.QUESTION_TIME ),
     ROUND         ( "Round",        true,        PGNTag.QUESTION      ),
     WHITE         ( "White",        true,        PGNTag.QUESTION      ),
     BLACK         ( "Black",        true,        PGNTag.QUESTION      ),
+    RESULT        ( "Result",       true,        PGNTag.NON_RESULT    ),
     WHITE_TITLE   ( "WhiteTitle",   false,       PGNTag.HYPHEN        ),
     BLACK_TITLE   ( "BlackTitle",   false,       PGNTag.HYPHEN        ),
     WHITE_ELO     ( "WhiteElo",     false,       PGNTag.HYPHEN        ),
@@ -50,16 +53,16 @@ public enum PGNTag {
     SUBVARIATION  ( "SubVariation", false,       PGNTag.EMPTY         ),
     ECO           ( "ECO",          false,       PGNTag.EMPTY         ),
     NIC           ( "NIC",          false,       PGNTag.EMPTY         ),
-    UTC_DATE      ( "UTCDate",      false,       PGNTag.QUESTION_DATE ),
+    TIME          ( "Time",         false,       PGNTag.QUESTION_TIME ),
     UTC_TIME      ( "UTCTime",      false,       PGNTag.QUESTION_TIME ),
+    UTC_DATE      ( "UTCDate",      false,       PGNTag.QUESTION_DATE ),
     TIME_CONTROL  ( "TimeControl",  false,       PGNTag.QUESTION      ),
     SETUP         ( "SetUp",        false,       PGNTag.ZERO          ),
     FEN           ( "FEN",          false,       PGNTag.EMPTY         ),
     TERMINATION   ( "Termination",  false,       PGNTag.EMPTY         ),
     ANNOTATOR     ( "Annotator",    false,       PGNTag.EMPTY         ),
     MODE          ( "Mode",         false,       PGNTag.EMPTY         ),
-    PLY_COUNT     ( "PlyCount",     false,       PGNTag.EMPTY         ),
-    RESULT        ( "Result",       true,        PGNTag.NON_RESULT    );
+    PLY_COUNT     ( "PlyCount",     false,       PGNTag.EMPTY         );
 
     public static final String EMPTY = "";
     public static final String HYPHEN = "-";
@@ -93,4 +96,27 @@ public enum PGNTag {
         return defaultValue;
     }
 
+    public static PGNTag[] tags() {
+        PGNTag[] tags = values();
+        Arrays.sort(
+                tags, new TagComparator()
+        );
+        return tags;
+    }
+
+    static class TagComparator implements Comparator<PGNTag> {
+
+        @Override
+        public int compare(PGNTag tag1, PGNTag tag2) {
+            if (tag1.isRequired && tag2.isRequired) {
+                return tag1.ordinal() - tag2.ordinal();
+            } else {
+                return tag1.isRequired ? -1
+                        : tag2.isRequired ? 1
+                        : tag1.name().compareTo(tag2.name());
+            }
+        }
+
+    }
+
 }