from OS_class import *
import sys
import getopt
import ast

# MARK: parameters
k = 3
p = 6

sys_argv = sys.argv
if sys.argv[0][-3:] == '.py':
	sys_argv = sys.argv[1:]

try:
	opts, args = getopt.getopt(sys_argv,"k:p")
      
	for opt, arg in opts:
		if opt == '-k':
			k = int(arg)
		elif opt == '-p':
			p = int(arg)
except getopt.GetoptError:
      print ('Options: -k <number of pattern repetitions> -p <pattern length>')
      sys.exit(2)

print("""
Arguments:
	number of patterns repetitions k: {}
	pattern length p : {}
""".format(k,p))

# MARK: oritatami system
os = OS()

# MARK: name and delay
os.name = "Switchback 3 k:{} p:{}".format(k,p)
os.delay = 3

# MARK: bead types
os.categoryColors = { 
	"Z": {"name": "brown500"},
	"A": {"name": "green500"},
	"B": {"name": "blue500"},
	"C": {"name": "yellow500"},
	"D": {"name": "red500"},
}

Z = ["Z0"]
S = ["{}{}".format(_c,_i) for _c in ["A", "B", "C", "D"] for _i in range(p)]

# MARK: rule
for _b in S[:p]:
	os.add_attraction(Z[0], _b)

for _j in range(2):
	_jj = 2*p*_j
	for _i in range(p-1):
		os.add_attraction_pairs(S, S, [(_i+_jj, _jj+2*p-2-_i), (_jj+2*p+1+_i, _jj+2*p-2-_i)])
	os.add_attraction_pairs(S, S, [(0+_jj, _jj+2*p-1), (_jj+2*p-1, _jj+2*p+1)])

# MARK: seed conformation
os.seedConformation = (k*p-1)*[Z[0], SE] + [Z[0]] +	 [E, S[0]]

# MARK: transcript prefix and period
declarations = [	
	OS.declare("SB0", OS.repeat(0,k,[S[:p]])),
	OS.declare("SB1", OS.repeat(0,k,[S[p:2*p]])),
	OS.declare("SB2", OS.repeat(0,k,[S[2*p:3*p]])),
	OS.declare("SB3", OS.repeat(0,k,[S[3*p:]])),
]
os.compactTranscriptPrefix = [
	declarations,
	OS.unfold(1, k*p, "SB0"),
]
os.compactTranscriptPeriod = [
	declarations,
	"SB1",
	"SB2",
	"SB3",
	"SB0",
]
os.transcriptPeriodCount = 10

# MARK: save
os.save_as_json()
