#!/bin/python3
## Script to easily generate a set (concatenated scores)

import codecs, os, sys
from argparse import ArgumentParser

parser = ArgumentParser(__file__)
parser.add_argument('setfile')
parser.add_argument('-c',dest='copy',action='store_true',default=False,help="Copy files instead of just linkingi")
parser.add_argument('-t',dest='title',help="Title for the set")
parser.add_argument('scores',nargs='+')

args = parser.parse_args()

if os.path.isdir(args.setfile):
	print("First argument cannot be a directory ")
	sys.exit()

if os.path.dirname(args.setfile):
    os.makedirs(os.path.dirname(args.setfile), exist_ok=True)

if args.setfile == '--':
    fprint = print  
else:
    fpoint = codecs.open(args.setfile, 'w+', 'utf8')
    fprint = fpoint.write

fprint(u'\ufeff')
fprint('\\version \"2.18.2\"\n\n')

if args.title:
    fprint(
"\header {"+
    "title = \"" + args.title + "\""+
"}\n")

fprint(
"\paper {"+
    "#(define page-breaking ly:minimal-breaking)" +
"}\n")

fprint("#(ly:set-option 'relative-includes #t)\n")

fprint("\n\n%Scores\n")

for f in args.scores:

	if not os.path.exists(f):
		continue

	if args.copy is True:
		text = codecs.open(f, 'r', 'utf8').read()
		if text.startswith(u'\ufeff'): text = text[1:]
		text = text.split(u'\n')	

		for line in text:	
			if line.startswith(u'\\include'):
				incline = line.replace('\\include', '').strip('"\' ')
			
				if not incline.startswith('\\'): #already absolute
					incline = os.path.join(os.path.abspath(os.path.dirname(f)), incline)
			
				line = "\\include \""+incline+"\""
			fprint(line.replace('\r', '')+'\n')
	else:
		fprint('\\include \"' + os.path.join( os.path.abspath( os.curdir ) ,f) + '\"\n')

fpoint.close()