import Tkinter, SizeSelector, os, sys
import shutil

trashDir = "/usr/media/distribute"

burnerDevice = "/dev/scd0"

class BurnError(Exception):
	pass

class MainWidget(Tkinter.Tk):
	def __init__(self, dir, *args, **kwargs):
		apply(Tkinter.Tk.__init__, (self,)+args, kwargs)
		self.db = SizeSelector.DirBrowser(self, dir)
		self.db.pack(side=Tkinter.TOP, expand=1, fill=Tkinter.BOTH)
		self._makeButtons()
		self.result = 0

	def _makeButtons(self):
		butFrame = Tkinter.Frame(self)
		Tkinter.Button(butFrame, text="Cancel", command=self._cancel).pack(
			expand=0, fill=Tkinter.X, side=Tkinter.LEFT)
		Tkinter.Button(butFrame, text="Burn", command=self._ok).pack(
			expand=0, fill=Tkinter.X, side=Tkinter.LEFT)
		Tkinter.Button(butFrame, text="Gather mode", 
			command=self.db.selectMultiple()).pack(
			expand=0, fill=Tkinter.X, side=Tkinter.LEFT)
		Tkinter.Button(butFrame, text="Swipe mode", 
			command=self.db.selectExtended()).pack(
			expand=0, fill=Tkinter.X, side=Tkinter.LEFT)
		butFrame.pack(side=Tkinter.TOP, expand=1, fill=Tkinter.BOTH)

	def _cancel(self):
		self.result = 0
		self.quit()
	
	def _ok(self):
		self.result = 1
		self.quit()

	def getFiles(self):
		return self.db.getFileList()

def burnIt(fileList):
	if os.system("genisoimage -v -f -l -R -J -r -o /usr/media/cd.img %s"%(
		" ".join(['"%s"'%s for s in fileList]))):
		raise BurnError("genisomage")
	else:
		if os.system("sudo wodim -eject -overburn -tao -v dev=%s"
				" driveropts=burnproof /usr/media/cd.img"%burnerDevice):
			raise BurnError("cdrecord")

def burnDVD(fileList):
	if os.system("genisoimage -v -f -l -R -J -r -o /usr/media/cd.img %s"%(
		" ".join(['"%s"'%s for s in fileList]))):
		raise BurnError, "mkisofs"
	else:
		if os.system("growisofs -dvd-compat -Z %s"
				"=/usr/media/cd.img"%burnerDevice):
#			print "Warning: cdrecord may have failed"
			raise BurnError, "cdrecord"


def removeFiles(fileList):
	for fn in fileList:
		try:
			shutil.move(fn, os.path.join(trashDir, os.path.basename(fn)))
		except os.error:
			print "Couldn't unlink %s"%fn


def main():
	app = MainWidget(sys.argv[1])
	app.mainloop()
	app.withdraw()
	if app.result:
		fileList = app.getFiles()
#		burnDVD(fileList)
		burnIt(fileList)
		print "Burnt files:"
		print "\n".join(app.getFiles())
		answer = raw_input("(Re)move them? ")
		if answer=="y":
			removeFiles(fileList)


if __name__=="__main__":
	main()
