using Plots

##############Final Displacement#####################
function plotFinalDisplacement(name)
    setupViz=getSetup1("$(name)/0")
    maxNumFiles=setupViz["maxNumFiles"]
    setupVizLast=getSetup1("$(name)/$(Int(maxNumFiles-1))");
    nodes=setupVizLast["nodes"]
    disX=[]
    disY=[]
    disZ=[]
    for node in nodes
        append!(disX,[node["displacement"]["x"]])
        append!(disY,[node["displacement"]["y"]])
        append!(disZ,[node["displacement"]["z"]])
    end
    display(scatter(disX,title="final x displacement",label="",ylabel="displacement",xlabel="node ID"))
    display(scatter(disY,title="final y displacement",label="",ylabel="displacement",xlabel="node ID")) 
    display(scatter(disZ,title="final z displacement",label="",ylabel="displacement",xlabel="node ID")) 
end

function plotFinalDisplacement(name,axis)
    setupViz=getSetup1("$(name)/0")
    maxNumFiles=setupViz["maxNumFiles"]
    setupVizLast=getSetup1("$(name)/$(Int(maxNumFiles-1))");
    nodes=setupVizLast["nodes"]
    dis=[]
    for node in nodes
        append!(dis,[node["displacement"][axis]])
    end
    display(scatter(dis,title="final $(axis) displacement",label="",ylabel="displacement",xlabel="node ID"))
end

function getFinalDisplacement(name,id,axis)
    setupViz=getSetup1("$(name)/0")
    maxNumFiles=setupViz["maxNumFiles"]
    setupVizLast=getSetup1("$(name)/$(Int(maxNumFiles-1))");
    node=setupVizLast["nodes"][id]
    return node["displacement"][axis]
end

function plotFinalDisplacementFEA(setup,name)
    nodes=setup["nodes"]
    disXFEA=[]
    disYFEA=[]
    disZFEA=[]
    for node in nodes
        append!(disXFEA,[node["displacement"]["x"]])
        append!(disYFEA,[node["displacement"]["y"]])
        append!(disZFEA,[node["displacement"]["z"]])
    end

    setupViz=getSetup1("$(name)/0")
    maxNumFiles=setupViz["maxNumFiles"]
    setupVizLast=getSetup1("$(name)/$(Int(maxNumFiles-1))");
    nodes=setupVizLast["nodes"]
    disX=[]
    disY=[]
    disZ=[]
    for node in nodes
        append!(disX,[node["displacement"]["x"]])
        append!(disY,[node["displacement"]["y"]])
        append!(disZ,[node["displacement"]["z"]])
    end
    scatter(disX,title="final x displacement",label="//",ylabel="displacement",xlabel="node ID")
    display(scatter!(disXFEA,title="final x displacement",label="FEA",ylabel="displacement",xlabel="node ID",alpha = 0.75,markershape  =:utriangle))

    scatter(disY,title="final y displacement",label="//",ylabel="displacement",xlabel="node ID")
    display(scatter!(disYFEA,title="final y displacement",label="FEA",ylabel="displacement",xlabel="node ID",alpha = 0.75,markershape  =:utriangle)) 

    scatter(disZ,title="final z displacement",label="//",ylabel="displacement",xlabel="node ID")
    display(scatter!(disZFEA,title="final z displacement",label="FEA",ylabel="displacement ",xlabel="node ID",alpha = 0.75,markershape  =:utriangle)) 
end
#################DisplacementTroughTimeSteps##################
function plotDisplacementTroughTimeSteps(name,id)
    setupViz=getSetup1("$(name)/0")
    maxNumFiles=setupViz["maxNumFiles"]
    numTimeSteps=setupViz["numTimeSteps"]
    x=(1:maxNumFiles).*floor(numTimeSteps/maxNumFiles)
    
    disX=[]
    disY=[]
    disZ=[]
    for i in 0:(maxNumFiles-1)
        setupViz=getSetup1("$(name)/$(Int(i))");
        node=setupViz["nodes"][id]
        append!(disX,[node["displacement"]["x"]])
        append!(disY,[node["displacement"]["y"]])
        append!(disZ,[node["displacement"]["z"]])

    end
    display(plot(x,disX,title="x displacement",label="",ylabel="displacement",xlabel="timestep"))
    display(plot(x,disY,title="y displacement",label="",ylabel="displacement",xlabel="timestep"))
    display(plot(x,disZ,title="z displacement",label="",ylabel="displacement",xlabel="timestep"))
end

function plotDisplacementTroughTimeSteps(name,id,axis)
    setupViz=getSetup1("$(name)/0")
    maxNumFiles=setupViz["maxNumFiles"]
    numTimeSteps=setupViz["numTimeSteps"]
    x=(1:maxNumFiles).*floor(numTimeSteps/maxNumFiles)
    
    dis=[]
    for i in 0:(maxNumFiles-1)
        setupViz=getSetup1("$(name)/$(Int(i))");
        node=setupViz["nodes"][id]
        append!(dis,[node["displacement"][axis]])

    end
    display(plot(x,dis,title="$(axis) displacement",label="",ylabel="displacement",xlabel="timestep"))
end

function plotDisplacementTroughTimeSteps(name)
    setupViz=getSetup1("$(name)/0")
    maxNumFiles=setupViz["maxNumFiles"]
    numTimeSteps=setupViz["numTimeSteps"]
    x=(1:maxNumFiles).*floor(numTimeSteps/maxNumFiles)
    
    disX=[]
    disY=[]
    disZ=[]
    for i in 0:(maxNumFiles-1)
        setupViz=getSetup1("$(name)/$(Int(i))");
        node=setupViz["nodes"][end]
        append!(disX,[node["displacement"]["x"]])
        append!(disY,[node["displacement"]["y"]])
        append!(disZ,[node["displacement"]["z"]])

    end
    display(plot(x,disX,title="x displacement",label="",ylabel="displacement",xlabel="timestep"))
    display(plot(x,disY,title="y displacement",label="",ylabel="displacement",xlabel="timestep"))
    display(plot(x,disZ,title="z displacement",label="",ylabel="displacement",xlabel="timestep"))
end
#############Stress######################

function plotStressTroughTimeSteps(name)
    setupViz=getSetup1("$(name)/0")
    maxNumFiles=setupViz["maxNumFiles"]
    numTimeSteps=setupViz["numTimeSteps"]
    x=(1:maxNumFiles).*floor(numTimeSteps/maxNumFiles)
    
    s=[]
    
    for i in 0:(maxNumFiles-1)
        setupViz=getSetup1("$(name)/$(Int(i))");
        edge=setupViz["edges"][end]
        append!(s,[edge["stress"]])

    end
    display(plot(x,s,title="x",label="",ylabel="stress",xlabel="timestep"))
    
end

function plotFinalStress(name)
    setupViz=getSetup1("$(name)/0")
    maxNumFiles=setupViz["maxNumFiles"]
    setupVizLast=getSetup1("$(name)/$(Int(maxNumFiles-1))");
    edges=setupVizLast["edges"]
    s=[]
    
    for edge in edges
        append!(s,[edge["stress"]])
        
    end
    # println(s)
    display(scatter(s,title="final stress",label="",ylabel="stress",xlabel="node ID"))
end

###############Strain####################
function plotStressStrainTroughTimeSteps(name,id)
    setupViz=getSetup1("$(name)/0")
    maxNumFiles=setupViz["maxNumFiles"]
    numTimeSteps=setupViz["numTimeSteps"]
    x=(1:maxNumFiles).*floor(numTimeSteps/maxNumFiles)
    
    stress=[]
    strain=[]
    
    for i in 0:(maxNumFiles-1)
        setupViz=getSetup1("$(name)/$(Int(i))");
        edge=setupViz["edges"][id]
        node1=setupViz["nodes"][edge["source"]+1]
        node2=setupViz["nodes"][edge["target"]+1]
        p11=Vector3(node1["position"]["x"],
                    node1["position"]["y"],
                    node1["position"]["z"])
        p21=Vector3(node2["position"]["x"],
                    node2["position"]["y"],
                    node2["position"]["z"])
        p1=Vector3( node1["position"]["x"]+node1["displacement"]["x"],
                    node1["position"]["y"]+node1["displacement"]["y"],
                    node1["position"]["z"]+node1["displacement"]["z"])
        p2=Vector3( node2["position"]["x"]+node2["displacement"]["x"],
                    node2["position"]["y"]+node2["displacement"]["y"],
                    node2["position"]["z"]+node2["displacement"]["z"])
        append!(stress,[edge["stress"]])
        append!(strain,[(lengthVector3(p1-p2)/lengthVector3(p11-p21))-1.0])

    end
    
    # display(plot(stress./strain,title="yougs modulus",label=""))
    display(plot(x,stress./(strain.+1.0),title="",label="",ylabel="stress/strain",xlabel="timestep"))
    display(plot(x,stress,title="stress",label="",ylabel="stress",xlabel="timestep"))
    display(plot(x,strain,title="strain",label="",ylabel="strain",xlabel="timestep"))
    display(plot(stress,strain,title="stress strain",label="",ylabel="stress",xlabel="strain"))

    
end

function plotPrescribedTroughTimeSteps(name,id,strainData,stressData)
    setupViz=getSetup1("$(name)/0")
    maxNumFiles=setupViz["maxNumFiles"]
    numTimeSteps=setupViz["numTimeSteps"]
    x=(1:maxNumFiles).*floor(numTimeSteps/maxNumFiles)
    
    stress=[]
    strain=[]
    currentID=1
    prescribedX=[]
    prescribedY=[]
    
    for i in 0:(maxNumFiles-1)
        setupViz=getSetup1("$(name)/$(Int(i))");
        edge=setupViz["edges"][id]
        node1=setupViz["nodes"][edge["source"]+1]
        node2=setupViz["nodes"][edge["target"]+1]
        p11=Vector3(node1["position"]["x"],
                    node1["position"]["y"],
                    node1["position"]["z"])
        p21=Vector3(node2["position"]["x"],
                    node2["position"]["y"],
                    node2["position"]["z"])
        p1=Vector3( node1["position"]["x"]+node1["displacement"]["x"],
                    node1["position"]["y"]+node1["displacement"]["y"],
                    node1["position"]["z"]+node1["displacement"]["z"])
        p2=Vector3( node2["position"]["x"]+node2["displacement"]["x"],
                    node2["position"]["y"]+node2["displacement"]["y"],
                    node2["position"]["z"]+node2["displacement"]["z"])
        append!(stress,[edge["stress"]])
        append!(strain,[(lengthVector3(p1-p2)/lengthVector3(p11-p21))-1.0])
        if currentID<=length(strainData)
            if (strain[end]>strainData[currentID]) ||(currentID>4&&strain[end]<0.3)
                append!(prescribedX,[i*floor(numTimeSteps/maxNumFiles)])
                append!(prescribedY,[stressData[currentID]/(strainData[currentID]+1.0)])
                currentID+=1
            end
        end

    end
    # prescribedX[4]=0.9e4
    # println(currentID)
    # println(length(strainData))
    # println(prescribedX)
    # display(plot(stress./strain,title="yougs modulus",label=""))
    plot(x,stress./(strain.+1.0),title="",label="Observed",ylabel="stress/strain",xlabel="timestep")
    scatter!(prescribedX,prescribedY,title="",label="",color=:black)
    display(plot!(prescribedX,prescribedY,title="",label="Prescibed",color=:black))


    
end

##################################