"""Provides a scripting component.
    Inputs:
        x: The x script variable
        y: The y script variable
    Output:
        a: The a output variable"""

__author__ = "yie-sheng chen"
__version__ = "2022.02.22"

import rhinoscriptsyntax as rs
import math
import copy
import Rhino.Geometry as geom
import scriptcontext as sc
import random

MTOL = sc.doc.ModelAbsoluteTolerance
ATOL = sc.doc.ModelAngleToleranceRadians


# def createVTube(p, oR, iR, h, bT): # innerRadius, outerRadius, bottomThickness
def createVGTube(p, r, t, h, bT): # radius, thickness, height, bottom thickness ; G = Groundup ; V = vertical
  # geom.Brep.CreatePipe
  p2 = rs.CreatePoint(p[0],p[1],h)
  l = rs.AddLine(p, p2)
  ll = copy.copy( rs.coercecurve(l) )
  brepsA = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r, True, 0, False, MTOL, ATOL)[0], MTOL)
  p1 = rs.CreatePoint(p[0],p[1],bT)
  l = rs.AddLine(p1, p2)
  ll = copy.copy( rs.coercecurve(l) )
  brepsB = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r - t, True, 0, False, MTOL, ATOL)[0], MTOL)
  breps = geom.Brep.CreateBooleanDifference(brepsA, brepsB, ATOL )[0]
  return breps

def createVCTube(p, r, t, h): # C = Cap
  p2 = rs.CreatePoint(p[0],p[1],h)
  l = rs.AddLine(p, p2)
  ll = copy.copy( rs.coercecurve(l) )
  brepsA = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r, True, 0, False, MTOL, ATOL)[0], MTOL)
  p1 = rs.CreatePoint(p[0],p[1],h-1)
  l = rs.AddLine(p, p1)
  ll = copy.copy( rs.coercecurve(l) )
  brepsB = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r - t, True, 0, False, MTOL, ATOL)[0], MTOL)
  breps = geom.Brep.CreateBooleanDifference(brepsA, brepsB, ATOL )[0]
  return breps

def createVTube(p, r, t, h): # C = Cap
  p2 = rs.CreatePoint(p[0],p[1],h)
  l = rs.AddLine(p, p2)
  ll = copy.copy( rs.coercecurve(l) )
  brepsA = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r, True, 0, False, MTOL, ATOL)[0], MTOL)
  # p1 = rs.CreatePoint(p[0],p[1],h-1)
  # l = rs.AddLine(p, p1)
  # ll = copy.copy( rs.coercecurve(l) )
  brepsB = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r - t, True, 0, False, MTOL, ATOL)[0], MTOL)
  breps = geom.Brep.CreateBooleanDifference(brepsA, brepsB, ATOL )[0]
  return breps

def createRackHolder():
  # p2 = rs.CreatePoint(lCP[0]+5,lCP[1]+5,3)
  # p1 = rs.CreatePoint(p2[0]-10,p2[1]-10,3)
  # l = rs.AddLine(p1, p2)
  # ll = copy.copy( rs.coercecurve(l) )
  # brepOpen = geom.Brep.CreateBooleanDifference(pipesD["lower inner vessel"], brepH, ATOL )[0]
  # pipes.append(brepOpen)
  i = 3
  step = 8
  p2 = rs.CreatePoint(lCP[0]+5,lCP[1]+5,0)
  p1 = rs.CreatePoint(p2[0]-10,p2[1]-10,0)
  l = rs.AddLine(p1, p2)
  ll = copy.copy( rs.coercecurve(l) )
  brepH = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, 3, True, 0, False, MTOL, ATOL)[0], MTOL)
  translate = geom.Transform.Translation(0, 0, step)
  brepOpen = pipesD["lower inner vessel"]
  while i + step < ivH:
    brepH.Transform(translate)
    brepOpen = geom.Brep.CreateBooleanDifference(brepOpen, brepH, ATOL )[0]
    # pipes.append(brepOpen)
    i += step
  p2 = rs.CreatePoint(lCP[0],lCP[1],ivH-step*7)
  l = rs.AddLine(lCP, p2)
  ll = copy.copy( rs.coercecurve(l) )
  brepH = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, 2, True, 0, False, MTOL, ATOL)[0], MTOL)
  translate = geom.Transform.Translation(0, 5, step*4)
  brepH.Transform(translate)
  brepOpen = geom.Brep.CreateBooleanDifference(brepOpen, brepH, ATOL )[0]
  # pipes.append(brepH)
  # pipes.append(brepOpen)
  return brepOpen

def connectSphVessel(sphAK,sphBK): # sphereA's key, sphereB's key
  p2 = spheresD[sphAK][1]
  p2c = rs.CreatePoint(p2[0],p2[1],spheresD[sphAK][2] - 0.6*spheresD[sphAK][3] )
  p1 = spheresD[sphBK][1]
  p1c = rs.CreatePoint(p1[0],p1[1],spheresD[sphBK][2] - 0.6*spheresD[sphBK][3] )
  l = rs.AddLine(p1c, p2c)
  ll = copy.copy( rs.coercecurve(l) )
  brepH = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, 4, True, 0, False, MTOL, ATOL)[0], MTOL)
  sphbrepA = geom.Brep.CreateBooleanDifference(spheresD[sphAK][0], brepH, ATOL )[0]
  spheresD[sphAK][0] =sphbrepA
  sphbrepB = geom.Brep.CreateBooleanDifference(spheresD[sphBK][0], brepH, ATOL )[0]
  spheresD[sphBK][0] =sphbrepB
  # spheres.append(sphbrepA)
  # spheres.append(sphbrepB)
  print(sphbrepB)
  # #
  r = 4
  t = 1
  brepsA = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r, True, 0, False, MTOL, ATOL)[0], MTOL)
  brepsB = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r - t, True, 0, False, MTOL, ATOL)[0], MTOL)
  breps = geom.Brep.CreateBooleanDifference(brepsA, brepsB, ATOL )[0]
  spheresD[sphAK+sphBK] = breps
  # spheres.append(breps)
  #
  p1 = spheresD[sphBK][1]
  p1c = rs.CreatePoint(p1[0],p1[1],spheresD[sphBK][2])
  # l = rs.AddLine(p1,p1c)
  # ll = copy.copy( rs.coercecurve(l) )
  # brepH = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, 1, True, 0, False, MTOL, ATOL)[0], MTOL)
  # sphbrepB = geom.Brep.CreateBooleanDifference(sphbrepB, brepH, ATOL )[0]
  # spheres.append(sphbrepB)
  #
  sph = geom.Sphere(p1c, spheresD[sphBK][3] ) # 2:H, 3:r
  sphbrepToCut = geom.Brep.CreateQuadSphere(sph)
  p = spheresD[sphBK + "p"]
  # spheres.append(sphbrepToCut)
  p = geom.Brep.CreateBooleanDifference(p, sphbrepToCut, ATOL )[0]
  # spheres.append(p)
  spheresD[sphBK + "p"+"cut"] = p
  p = spheresD[sphAK+sphBK]
  p = geom.Brep.CreateBooleanDifference(p, sphbrepToCut, ATOL )[0]
  spheresD[sphAK+sphBK] = p
  
  p1 = spheresD[sphAK][1]
  p1c = rs.CreatePoint(p1[0],p1[1],spheresD[sphAK][2])
  p1H = rs.CreatePoint(p1[0],p1[1],ivH)
  # l = rs.AddLine(p1H,p1c)
  # ll = copy.copy( rs.coercecurve(l) )
  # brepH = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, 10, True, 0, False, MTOL, ATOL)[0], MTOL)
  # sphbrepA = geom.Brep.CreateBooleanDifference(sphbrepA, brepH, ATOL )[0]
  # spheres.append(sphbrepA)
  # spheresD[] =sphbrepAp
  #
  ## sph = geom.Sphere(p1c, spheresD[sphAK][3]-1) # 2:H, 3:r
  ## sphbrepToCut = geom.Brep.CreateQuadSphere(sph)
  ## p = spheresD[sphAK + "p"]
  ## # spheres.append(sphbrepToCut)
  ## p = geom.Brep.CreateBooleanDifference(p, sphbrepToCut, ATOL )[0]
  ## # spheres.append(p)
  ## spheresD[sphAK + "p"+"cut"] = p
  ## print(sphAK+sphBK)
  ## p = spheresD[sphAK+sphBK]
  ## p = geom.Brep.CreateBooleanDifference(p, sphbrepToCut, ATOL )[0]
  ## # spheres.append(p)
  ## spheresD[sphAK+sphBK+"cut"] = p
  ## print(sphAK+sphBK+"cut")
  # sph = geom.Sphere(p1c, spheresD[sphBK][3]) # 2:H, 3:r
  # sphbrepToCut = geom.Brep.CreateQuadSphere(sph)
  # p = spheresD[sphBK + "p"]
  # p = geom.Brep.CreateBooleanDifference(p, sphbrepToCut, ATOL )[0]
  # spheresD[sphBK + "p"+"cut"] = p
  # p = spheresD[sphAK+sphBK+"cut"]
  # p = geom.Brep.CreateBooleanDifference(p, sphbrepToCut, ATOL )[0]
  # spheresD[sphAK+sphBK+"cut"] = p
  pass

def createSphVessel(sphVP, sphVH=20, sphR=15):
  # sphVP = rs.CreatePoint(p0[0]-30,p0[1]-30,0) # sphere vessel point
  # sphVH = 20 # sphere vessel height
  # sphR = 15
  pUpper = rs.CreatePoint(sphVP[0],sphVP[1],sphVH)
  sph = geom.Sphere(pUpper, sphR)
  sphbrep = geom.Brep.CreateQuadSphere(sph)
  #
  p2 = rs.CreatePoint(sphVP[0],sphVP[1],sphVH+2)
  p1 = rs.CreatePoint(sphVP[0],sphVP[1],sphVH+2+sphR*2)
  # print("p1:")
  # print(p1)
  # print("p2:")
  # print(p2)
  l = rs.AddLine(p1, p2)
  ll = copy.copy( rs.coercecurve(l) )
  brepH = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, 4, True, 0, False, MTOL, ATOL)[0], MTOL)
  sphbrep = geom.Brep.CreateBooleanDifference(sphbrep, brepH, ATOL )[0]
  #
  sph = geom.Sphere(pUpper, sphR-1)
  sphbrepToCut = geom.Brep.CreateQuadSphere(sph)
  sphbrep = geom.Brep.CreateBooleanDifference(sphbrep, sphbrepToCut, ATOL )[0]
  #
  # spheres.append(sphbrep)
  # p = createVGTube(sphVP, 5, 0.8, sphVH - sphR*0.6, 1)
  p = createVCTube(sphVP, 5, 0.8, sphVH + sphR*1.2)
  # sphbrep = geom.Brep.CreateBooleanDifference(p, sphbrepToCut, ATOL )[0]
  p = geom.Brep.CreateBooleanDifference(p, sphbrepToCut, ATOL )
  print(len(p))
  # spheres.append(p)
  return sphbrep, p


pipesD = {}
pipes = []
floatingP = []
spheresD = {}
spheres = []
p0 = rs.CreatePoint(0,0,0)
#floatingP = createVGTube(p0, 3.8, 0.8, 60, 1)
#
#lCP = rs.CreatePoint(p0[0]+30,p0[1]+30,0) # lower container point
#p = createVGTube(lCP, 13, 0.8, 80, 1) # p, r, t, h, bT
#pipesD["lower vessel"] = p
#
ivH = 200 # inner vessel height
#
sphVP = rs.CreatePoint(p0[0]-50,p0[1]-50,0) # sphere vessel point
sphbrep, p = createSphVessel(sphVP, 40, 20) # sphVP, sphVH, sphR
print(sphbrep)
# spheres.append(sphbrep)
spheresD["A"] = [sphbrep,sphVP, 40, 20]
spheresD["Ap"] = p[1]
spheresD["Ac"] = p[0]
# spheres.append(p)
#

#
sphVP = rs.CreatePoint(p0[0]-10,p0[1]-30,0) # sphere vessel point
sphbrep, p = createSphVessel(sphVP, 20, 15) # sphVP, sphVH, sphR
print(sphbrep)
# spheres.append(sphbrep)
# spheres.append(p)
spheresD["B"] = [sphbrep,sphVP, 20, 15]
spheresD["Bp"] = p[1]
spheresD["Bc"] = p[0]
#
# connect:
#
connectSphVessel("A", "B")
sphAK = "A"
sphBK = "B"
# spheres.append(spheresD[sphAK][0])
# spheres.append(spheresD[sphBK][0])
# spheres.append(spheresD[sphAK+sphBK])
# spheres.append(spheresD[sphAK + "p"+"cut"])
# spheres.append(spheresD[sphBK + "p"+"cut"])
# spheres.append(spheresD[sphAK+sphBK+"cut"])
spheres.append(spheresD[sphAK + "p"])
spheres.append(spheresD[sphBK + "p"])
spheres.append(spheresD[sphAK+sphBK])
spheres.append(spheresD["Bc"])
#
p1 = spheresD["A"][1]
p1c = rs.CreatePoint(p1[0],p1[1],spheresD["A"][2])
p1H = rs.CreatePoint(p1[0],p1[1],ivH)
l = rs.AddLine(p1H,p1c)
ll = copy.copy( rs.coercecurve(l) )
brepH = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, 19, True, 0, False, MTOL, ATOL)[0], MTOL)
p = spheresD[sphAK][0]
p = geom.Brep.CreateBooleanDifference(p, brepH, ATOL )[0]
spheres.append(p)
#
p = spheresD[sphBK][0]
p1 = spheresD[sphBK][1]
p1c = rs.CreatePoint(p1[0],p1[1],spheresD[sphBK][2])
l = rs.AddLine(p1,p1c)
ll = copy.copy( rs.coercecurve(l) )
brepH = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, 4, True, 0, False, MTOL, ATOL)[0], MTOL)
p = geom.Brep.CreateBooleanDifference(p, brepH, ATOL )[0]
spheres.append(p)
#
p1 = spheresD[sphAK][1]
p1c = rs.CreatePoint(p1[0],p1[1],spheresD[sphAK][2])
p = createVTube(p1c, 20, 0.8, 100)
sph = geom.Sphere(p1c, spheresD[sphAK][3]) # 2:H, 3:r
sphbrepToCut = geom.Brep.CreateQuadSphere(sph)
p = geom.Brep.CreateBooleanDifference(p, sphbrepToCut, ATOL )[0]
spheres.append(p)
#



for item in pipesD.items():
  # print(item[0])
  if item[0] in ["lower inner vessel"]:
    # print(item[0] + " test")
    continue
  pipes.append(item[1])
  print(item[0] + " added")

