from netgen.csg import *
from netgen import meshing
import filecmp
import difflib
from math import sqrt, cos, sin

def CreateQuad():
    base = Plane(Pnt(0,0,0),Vec(0,0,1))
    surface = SplineSurface(base)
    pts = [(-0.2,-0.2,0),(-0.2,0.2,0),(0.2,0.2,0),(0.2,-0.2,0)]
    geopts = [surface.AddPoint(*p) for p in pts]
    for p1,p2,bc in [(0,1,"wire"), (1, 2,"contact"),(2,3,"wire"),(3,0,"wire")]:
        surface.AddSegment(geopts[p1],geopts[p2],bc)
    return surface

Cross = lambda a,b: [a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-b[0]*a[1]]


def CreateGeo():
    geo = CSGeometry()
    air = OrthoBrick(Pnt(-1,-1,-1),Pnt(1,1,1))
    geo.Add(air.mat("air"))
    surface = CreateQuad()
    geo.AddSplineSurface(surface)
    return geo

def test_BBNDsave():
    mesh = CreateGeo().GenerateMesh(maxh=0.4,perfstepsend = meshing.MeshingStep.MESHSURFACE)
    for i in range(2):
        mesh.GenerateVolumeMesh(only3D_domain_nr=i+1,maxh=0.4)
    mesh.SetGeometry(None)
    mesh.Save("test.vol")
    mesh2 = meshing.Mesh()
    mesh2.Load("test.vol")
    mesh2.Save("test2.vol")
    with open("test.vol","r") as f:
        first = f.readlines()
    with open("test2.vol","r") as f:
        second = f.readlines()
    # exclude the face colours section (because they aren't in the same order)
    for i,line in enumerate(first):
        if line[0:12] == "face_colours":
            first = first[0:i]
            second = second[0:i]
            break
    diff = difflib.context_diff(first,second)
    print("File diff:")
    l = list(diff)
    print(*l)
    assert len(l)==0