from ordered_set import OrderedSet

def convert2ra(rname_args):
  rname = rname_args[0]
  args = rname_args[1]
  new_vars = ["x_"+str(i) for i in range(len(args))]
  new_args = list(zip(new_vars,args))
  print("\nnew_vars=",new_vars)
  print("\nnew_args=",new_args)
  
  step1 = "rename[" + ",".join(new_vars) + "](" + rname + ")"

  num_conds = [arg[0]+"="+str(arg[1][1]) for arg in new_args if arg[1][0] == "num"]
  str_conds = [arg[0]+"="+arg[1][1] for arg in new_args if arg[1][0] == "str"]
  const_conds = " and ".join(num_conds + str_conds)
  print("\nnum_conds=",num_conds)
  print("\nstr_conds=",str_conds)
  print("\nconst_conds=",const_conds)

  var_args = sorted([arg for arg in new_args if arg[1][0] == "var"])
  print("\nvar_args=",var_args)
  vars = list(OrderedSet([x[1][1] for x in var_args]))
  same_vars = [[y[0] for y in var_args if y[1][1] == x] for x in vars]
  print("\nsame_vars=",same_vars)

  same_conds = sorted([[v[i]+"="+v[i+1] for i in range(len(v)-1)] for v in same_vars])
  same_conds = [x for x in same_conds if x != []]
  same_conds = [" and ".join(cs) for cs in same_conds]
  same_conds = " and ".join(same_conds)
  print("\nsame_conds=",same_conds)

  conds = const_conds + " and " + same_conds if const_conds != "" and same_conds != "" \
          else same_conds if const_conds == "" and same_conds != "" \
          else const_conds if const_conds != "" and same_conds == "" else ""

  step1 = step1 if conds != "" else rname
  step2 = "select[" + conds + "](" + step1 + ")" if conds != "" else step1

  unique_vars = [[y[0] for y in var_args if y[1][1] == x][0] for x in vars]
  step3 = "project[" + ",".join(unique_vars) + "](" + step2 + ")" if step2 != step1 else step1

  result = "rename["+ ",".join(vars) + "](" + step3 + ")"
  return result

def parseF(data):
  data = data.strip()
  i = data.index("(")
  rname = data[:data.index("(")]
  args = data[i+1:-1].split(",")
  arguments = [ ("str",arg) if arg[0] == '"' and arg[-1] == '"' else 
                ("num",int(arg)) if arg.isdigit() else 
                ("var",arg)
                  for arg in args]
  return rname, arguments

def m():
    data = input('\nDLGAtom: ').strip()
    result = convert2ra(parseF(data)) if data != "exit" else "done"
    if result != "done":
      print("\n",result)
      m()
 
m()
