#! /usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@author: jacobfaibussowitsch
"""
import sys,os
try:
  import pyhesive
except ModuleNotFoundError:
  # silly pythonpath finagling in case someone runs this from cloning the git repo
  # rather than installing it as a package
  sys.path.append(os.path.join(os.getcwd(), ".."))
  import pyhesive


def parseArgs(argv):
  import argparse
  path = "<path>"
  string = "<string>"
  integer = "<int>"
  defaultFormat = "abaqus"
  defaultName = "pyhesiveOutput_{meshname}"
  parser = argparse.ArgumentParser(description="Insert Cohesive Elements Into Arbitrary Finite Element Mesh",formatter_class=argparse.ArgumentDefaultsHelpFormatter)
  parser.add_argument("-i","--input",required=True,metavar=path,help="specify the input mesh file",dest="meshFileIn")
  parser.add_argument("-b","--num-partitions",metavar=integer,default=3,const=-1,nargs="?",type=int,help="specify the number of partitions to make of the mesh, use -1 to make as many partitions as there are cells",dest="numPart")
  parser.add_argument("-o","--output",nargs="?",const=defaultName+"."+defaultFormat,default=defaultName+"."+defaultFormat,metavar=path,help="specify the output mesh file",dest="meshFileOut")
  parser.add_argument("-fi","--input-format",metavar=string,help="specify the input mesh file format, defaults to file extension",dest="meshFormatIn")
  parser.add_argument("-fo","--output-format",nargs="?",const=defaultFormat,default=defaultFormat,metavar=string,help="specify the output mesh file format",dest="meshFormatOut")
  parser.add_argument("-l","--log-file",nargs="?",default=sys.stdout.name,metavar=path,help="log output to file instead of STDOUT",dest="stream")
  parser.add_argument("-v","--verbose",default=1,action="count",help="increase verbosity of logging statements, default no logging",dest="verbosity")
  parser.add_argument("-p","--prune",action="store_true",help="prune dangling vertices",dest="prune")
  parser.add_argument("--verify",help="Perform verification tests after inserting cohesive elements",action="store_true")
  parser.set_defaults(vLevel=40)
  args = parser.parse_args(args=argv)

  if args.meshFileIn is not None:
    _,filen  = os.path.split(args.meshFileIn)
    filename = filen.split(".")[0]
  else:
    filename = "mesh"
    args.meshFileOut = args.meshFileOut.format(meshname=filename)
  if args.stream is not sys.stdout.name:
    args.stream = open(args.stream[0],"w")
  else:
    args.stream = sys.stdout
  for verb in range(args.verbosity):
    if args.vLevel >= 20:
      args.vLevel -= 10
  return args

def main(argv=None):
  args = parseArgs(argv)
  pyhesive.setLogLevel(args.vLevel)
  pyhesive.setLogStream(args.stream)
  with pyhesive.Mesh.fromFile(args.meshFileIn,formatIn=args.meshFormatIn) as pyh:
    pyh.partitionMesh(numPart=args.numPart)
    pyh.insertElements()
    if args.verify:
      pyh.verifyCohesiveMesh()
    pyh.writeMesh(args.meshFileOut,meshFormatOut=args.meshFormatOut,prune=args.prune)
  return

if __name__ == "__main__":
  main()
