package web;

import csp.Sudoku;
import org.json.*;

import java.util.HashSet;
import java.util.Set;

public class SudokuJSONSerializer {

    static Sudoku fromJSON(String string) {
        JSONObject root = new JSONObject(new JSONTokener(string));
        return new Sudoku(parseGivens(root), root.getInt("boxesPerRow"), root.getInt("boxesPerColumn"));
    }

    static String toJSON(Sudoku sudoku) {
        if (!sudoku.isSolved()) {
            return new JSONStringer()
                    .object()
                    .key("givens")
                    .value(stringifyGivens(sudoku))
                    .endObject()
                    .toString();
        }

        JSONArray candidates = new JSONArray();
        sudoku.getSolution().forEach((candidate) -> candidates.put(stringifyCandidate(candidate)));
        return new JSONStringer()
                .object()
                .key("solution")
                .value(candidates)
                .endObject()
                .toString();
    }

    private static Set<Sudoku.Candidate> parseGivens(JSONObject root) {
        JSONArray givens = root.getJSONArray("givens");

        Set<Sudoku.Candidate> candidates = new HashSet<>();
        for (int i = 0; i < givens.length(); ++i) {
            candidates.add(parseCandidate(givens.getJSONObject(i)));
        }
        return candidates;
    }

    private static JSONArray stringifyGivens(Sudoku sudoku) {
        JSONArray arr = new JSONArray();

        sudoku.getGivens().forEach((given) -> arr.put(stringifyCandidate(given)));
        return arr;
    }

    private static Sudoku.Candidate parseCandidate(JSONObject candidate) {
        return new Sudoku.Candidate(candidate.getInt("row"), candidate.getInt("column"), candidate.getInt("digit"));
    }

    private static JSONObject stringifyCandidate(Sudoku.Candidate candidate) {
        JSONObject blob = new JSONObject();
        blob.put("row", candidate.row);
        blob.put("column", candidate.column);
        blob.put("digit", candidate.digit);
        return blob;
    };
}

@@ -409,33 +409,162 @@
     
-if (!sudoku.isSolved()) %7B
+JSONArray arr = new JSONArray();%0A%0A        if (!sudoku.isSolved()) %7B%0A            sudoku.getGivens().forEach((given) -%3E arr.put(stringifyCandidate(given)));
 %0A   
@@ -694,31 +694,11 @@
 lue(
-stringifyGivens(sudoku)
+arr
 )%0A  
@@ -771,25 +771,24 @@
       %7D%0A
-%0A
         
 JSONArra
@@ -783,48 +783,19 @@
     
-JSONArray candidates = new JSONArray();%0A
+else %7B%0A    
     
@@ -842,26 +842,19 @@
 ate) -%3E 
-candidates
+arr
 .put(str
@@ -883,32 +883,36 @@
 ate)));%0A        
+   
+ 
 return new JSONS
@@ -929,32 +929,36 @@
                 
+    
 .object()%0A      
@@ -963,24 +963,28 @@
             
+ 
+   
 .key(%22soluti
@@ -1008,27 +1008,28 @@
     
+    
 .value(
-candidates)%0A
+arr)%0A    
     
@@ -1061,32 +1061,36 @@
                 
+    
 .toString();%0A   
@@ -1082,24 +1082,34 @@
 toString();%0A
+        %7D%0A
     %7D%0A%0A    p
@@ -1415,32 +1415,32 @@
 i)));%0A        %7D%0A
+
         return c
@@ -1461,222 +1461,8 @@
  %7D%0A%0A
-    private static JSONArray stringifyGivens(Sudoku sudoku) %7B%0A        JSONArray arr = new JSONArray();%0A%0A        sudoku.getGivens().forEach((given) -%3E arr.put(stringifyCandidate(given)));%0A        return arr;%0A    %7D%0A%0A
     

clean up SudokuJSONSerializer.java