using JsonSubTypes;
using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public static class JSONManager 
{

    public static Dictionary<string, string> URIDictionary = new Dictionary<string, string> {
        {"point", "http://mathhub.info/MitM/core/geometry?3DGeometry?point" },
        {"tuple", "http://gl.mathhub.info/MMT/LFX/Sigma?Symbols?Tuple"},
        {"line", "http://mathhub.info/MitM/core/geometry?Geometry/Common?line_type" },
        {"distance", "http://mathhub.info/MitM/core/geometry?Geometry/Common?lineOf" }
    };




    [JsonConverter(typeof(JsonSubtypes), "kind")]
    public class MMTTerm
    {
        string kind;
    }

    public class OMA : MMTTerm
    {
        public MMTTerm applicant;
        public List<MMTTerm> arguments;
        public string kind = "OMA";
        public OMA(MMTTerm applicant, List<MMTTerm> arguments)
        {
            this.applicant = applicant;
            this.arguments = arguments;
        }
    }

    public class OMS : MMTTerm
    {
        public string uri;
        public string kind = "OMS";

        public OMS(string uri, bool convertToURI = true)
        {
            if (convertToURI)
                this.uri = URIDictionary[uri];
            else
                this.uri = uri;
        }
    }


    public class OMF : MMTTerm
    {
        [JsonProperty("float")]
        public float f;
        public string kind = "OMF";

        public OMF(float f)
        {
            this.f = f;
        }
    }

    /*
    class DeclarationBody : MMTTerm
    {
        MMTTerm original;
        MMTTerm simplified;
        string kind = "O/S";
    }*/


    public class MMTDeclaration
    {
        public string label;
        public MMTTerm tp;
        public MMTTerm df;

        public MMTDeclaration(string label, MMTTerm tp, MMTTerm df)
        {
            this.label = label;
            this.tp = tp;
            this.df = df;
        }
    }

    public static MMTDeclaration FromJson(string json)
    {
        MMTDeclaration mmtDecl = JsonConvert.DeserializeObject<MMTDeclaration>(json);
        return mmtDecl;
    }
    public static string ToJson(MMTDeclaration mmtDecl)
    {
        string json = JsonConvert.SerializeObject(mmtDecl);
        return json;
    }

}