From 2d6b11b235336a1039a0450619f01637395b0377 Mon Sep 17 00:00:00 2001
From: BenniHome <benjamin.boesl@studium.fau.de>
Date: Wed, 1 Apr 2020 20:03:57 +0200
Subject: [PATCH]  ceated directions

---
 Assets/InventoryStuff/ScrollDetails.cs | 143 +++++++++++++++++++++----
 1 file changed, 123 insertions(+), 20 deletions(-)

diff --git a/Assets/InventoryStuff/ScrollDetails.cs b/Assets/InventoryStuff/ScrollDetails.cs
index 99bf5788..0226c95c 100644
--- a/Assets/InventoryStuff/ScrollDetails.cs
+++ b/Assets/InventoryStuff/ScrollDetails.cs
@@ -37,16 +37,19 @@ void Update()
 
     }
 
-    public void setScroll(Scroll s) {
+    public void setScroll(Scroll s)
+    {
         Transform scrollView = gameObject.transform.GetChild(2);
         Transform viewport = scrollView.GetChild(0);
         this.scroll = s;
         //wipe out old Displays
-        for (int i = 0; i < this.ParameterDisplays.Length; i++) {
+        for (int i = 0; i < this.ParameterDisplays.Length; i++)
+        {
             Destroy(ParameterDisplays[i]);
         }
         this.ParameterDisplays = new GameObject[s.declarations.Length];
-        for (int i = 0; i < s.declarations.Length; i++) {
+        for (int i = 0; i < s.declarations.Length; i++)
+        {
             var obj = Instantiate(parameterDisplayPrefab, Vector3.zero, Quaternion.identity, transform);
             //obj.GetComponent<RectTransform>().localPosition = GetPosition(i);
             obj.transform.GetChild(1).gameObject.GetComponent<TextMeshProUGUI>().text = s.declarations[i].description;
@@ -58,9 +61,11 @@ public void setScroll(Scroll s) {
         gameObject.transform.GetChild(1).gameObject.GetComponent<TextMeshProUGUI>().text = s.description;
     }
 
-    public void magicButton() {
-        string view = sendView();
-        if (view.Equals(FAIL)) {
+    public void magicButton()
+    {
+        string view = sendView2();
+        if (view.Equals(FAIL))
+        {
             Debug.Log("DAS HAT NICHT GEKLAPPT");
             //TODO: hier ne Art PopUp, wo drin steht, dass das nicht geklappt hat
             CommunicationEvents.PushoutFactFailEvent.Invoke(null);
@@ -72,11 +77,13 @@ public void magicButton() {
     }
 
     string FAIL = "FAIL";
-    class ViewResponse {
+    class ViewResponse
+    {
         public string view;
     }
 
-    private string sendView() {
+    private string sendView()
+    {
         string jsonRequest = @"{";
         jsonRequest = jsonRequest + @" ""from"":""" + this.scroll.problemTheory + @""", ";
         jsonRequest = jsonRequest + @" ""to"":""" + this.situationTheory + @""", ";
@@ -115,14 +122,102 @@ private string sendView() {
         }
     }
 
+    private string sendView2()
+    {
+        Dictionary<Declaration, Fact[]> possibilities = new Dictionary<Declaration, Fact[]>();
+        for (int i = 0; i < ParameterDisplays.Length; i++)
+        {
+            Fact fact_i = ParameterDisplays[i].GetComponentInChildren<DropHandling>().currentFact;
+            var drophandler = ParameterDisplays[i].GetComponentInChildren<DropHandling>();
+            Declaration decl_i = scroll.declarations[i];
+            if (fact_i is DirectedFact)
+            {
+                possibilities.Add(decl_i, new Fact[] { fact_i, ((DirectedFact)fact_i).flippedFact });
+            }
+            else
+            {
+                possibilities.Add(decl_i, new Fact[] { fact_i });
+            }
+        }
+        Dictionary<Declaration, Fact> selection = new Dictionary<Declaration, Fact>();
+        for (int i = 0; i < possibilities.Count; i++)
+        {
+            Declaration decl_i = new List<Declaration>(possibilities.Keys)[i];
+            selection[decl_i] = possibilities[decl_i][0];
+        }
+        return testPossibilities(selection, possibilities, 0);
+
+        return "";
+    }
+
+    private string testPossibilities(Dictionary<Declaration, Fact> selection, Dictionary<Declaration, Fact[]> possibilities, int i)
+    {
+        if (i == possibilities.Count)
+        {
+            return testVariant(selection);
+        }
+        else
+        {
+            Declaration decl_i = new List<Declaration>(possibilities.Keys)[i];
+            for (int j = 0; j < possibilities[decl_i].Length; j++)
+            {
+                Fact fact_j = possibilities[decl_i][j];
+                selection.Remove(decl_i);
+                selection.Add(decl_i, fact_j);
+                string ret = testPossibilities(selection, possibilities, i + 1);
+                if (ret != FAIL) return ret;
+            }
+        }
+        return FAIL;
+    }
+
+    private string testVariant(Dictionary<Declaration, Fact> selection)
+    {
+        string jsonRequest = @"{";
+        jsonRequest = jsonRequest + @" ""from"":""" + this.scroll.problemTheory + @""", ";
+        jsonRequest = jsonRequest + @" ""to"":""" + this.situationTheory + @""", ";
+        jsonRequest = jsonRequest + @" ""mappings"": { ";
+        for (int i = 0; i < selection.Count; i++)
+        {
+            Declaration decl_i = new List<Declaration>(selection.Keys)[i];
+            Fact fact_i = selection[decl_i];
+            if (decl_i.value != null && fact_i.backendValueURI != null)
+            {
+                jsonRequest = jsonRequest + @" """ + decl_i.value + @""":""" + fact_i.backendValueURI + @""",";
+            }
+            jsonRequest = jsonRequest + @" """ + decl_i.identifier + @""":""" + fact_i.backendURI + @""",";
+        }
+        //removing the last ','
+        jsonRequest = jsonRequest.Substring(0, jsonRequest.Length - 1);
+        jsonRequest = jsonRequest + "}}";
+
+        UnityWebRequest www = UnityWebRequest.Put("localhost:8081/view/add", jsonRequest);
+        www.method = UnityWebRequest.kHttpVerbPOST;
+        var async = www.Send();
+        while (!async.isDone) { }
+
+        if (www.isNetworkError || www.isHttpError)
+        {
+            Debug.Log(www.error);
+            return FAIL;
+        }
+        else
+        {
+            string answer = www.downloadHandler.text;
+            return JsonUtility.FromJson<ViewResponse>(answer).view;
+        }
+    }
+
 
-    class PushoutReturn {
+    class PushoutReturn
+    {
         public string newSituation;
         public PushoutFact[] outputs;
     }
 
     [System.Serializable]
-    public  class PushoutFact {
+    public class PushoutFact
+    {
         // generic class to make a common Supertype for all PushoutResponses
         public string uri;
         public string value;
@@ -131,12 +226,13 @@ public  class PushoutFact {
         public string c;
         public string pointA;
         public string pointB;
-        
+
         public string left;
         public string middle;
         public string right;
 
-        public bool isVector() {
+        public bool isVector()
+        {
             return a != null &&
                 b != null &&
                 c != null &&
@@ -145,7 +241,7 @@ public bool isVector() {
                 value == null &&
                 left == null &&
                 middle == null &&
-                right == null; 
+                right == null;
         }
         public bool isDistance()
         {
@@ -173,7 +269,8 @@ public bool isAngle()
         }
     }
 
-    private string pushout(string view) {
+    private string pushout(string view)
+    {
         string path = "localhost:8081/pushout?";
         path = path + "problem=" + this.scroll.problemTheory + "&";
         path = path + "solution=" + this.scroll.solutionTheory + "&";
@@ -199,14 +296,17 @@ private string pushout(string view) {
         }
     }
 
-    private void readPushout(string txt) {
+    private void readPushout(string txt)
+    {
         Debug.Log(txt);
         PushoutReturn ret = JsonUtility.FromJson<PushoutReturn>(txt);
         this.situationTheory = ret.newSituation;
         FactManager factManager = cursor.GetComponent<FactManager>();
-        for (int i = 0; i < ret.outputs.Length; i++) {
+        for (int i = 0; i < ret.outputs.Length; i++)
+        {
             PushoutFact f = ret.outputs[i];
-            if (f.isVector()) {
+            if (f.isVector())
+            {
                 float a = float.Parse(f.a);
                 float b = float.Parse(f.b);
                 float c = float.Parse(f.c);
@@ -216,7 +316,8 @@ private void readPushout(string txt) {
                 CommunicationEvents.AddFactEvent.Invoke(pf);
                 CommunicationEvents.PushoutFactEvent.Invoke(pf);
             }
-            if (f.isDistance()) {
+            if (f.isDistance())
+            {
                 int id = factManager.GetFirstEmptyID();
                 int pid1 = getIdforBackendURI(f.pointA);
                 int pid2 = getIdforBackendURI(f.pointB);
@@ -225,7 +326,8 @@ private void readPushout(string txt) {
                 CommunicationEvents.AddFactEvent.Invoke(lf);
                 CommunicationEvents.PushoutFactEvent.Invoke(lf);
             }
-            if (f.isAngle()){
+            if (f.isAngle())
+            {
                 int id = factManager.GetFirstEmptyID();
                 int pid1 = getIdforBackendURI(f.left);
                 int pid2 = getIdforBackendURI(f.middle);
@@ -238,7 +340,8 @@ private void readPushout(string txt) {
         }
     }
 
-    private int getIdforBackendURI(string uri) {
+    private int getIdforBackendURI(string uri)
+    {
         return CommunicationEvents.Facts.Find(x => x.backendURI.Equals(uri)).Id;
     }
 }
-- 
GitLab