from rhutil import chop
from Tkinter import *
from rhtkinter import *
from buttonbar import *

import os
import posix
import rhdialog

class PickSeriesWin(RHFrame):

    def createWidgets(self, series):

	m = Message(self, { 'text': 'What parts of Red Hat would you like to ' +
				'install? The basic system will be installed' +
				' automatically. If you want a complete' +
				" installation (which you probably don't)" +
				" you'll need to customize it.",
			   'aspect' : '600' })
	m.pack()

	seriesframe = Frame(self, { 'borderwidth' : '2', 'relief' : 'sunken' })
	leftframe = Frame(seriesframe)
	rightframe = Frame(seriesframe)
	
	self.cb = {}
	self.hasBase = 0
	names = series.keys()
	names.sort()
	odd = 1
	for name in names:
	    if (name == "Base"): 
		self.hasBase = 1
	    else:
		if (odd):
		    cb = Checkbutton(leftframe, { 'text' : name})
		else:
		    cb = Checkbutton(rightframe, { 'text' : name})
		odd = not odd

		cb.pack({ 'anchor' : 'w' })

		self.cb[name] = BooleanVar()
		cb['variable'] = self.cb[name]

		if (series[name]['default']):
		    self.cb[name].set('1')

	leftframe.pack({ 'side' : 'left', 'anchor' : 'n', 'fill' : 'both' })
	rightframe.pack({ 'side' : 'left', 'anchor' : 'n', 'fill' : 'both' })
	seriesframe.pack({ 'fill' : 'both', 'expand' : '1' })

	self.customize = BooleanVar()
	self.customize.set('1')
	cb = Checkbutton(self, { 'text' : 'Customize installation further'})
	cb['variable'] = self.customize
	#cb.pack({ 'anchor' : 'w'})
	cb.pack()

	b = ButtonBar(self)
	b.addButton('Done', self.done)
	b.pack({ 'fill' : 'x' })

    def done(self):
	self.quit()

    def getResult(self):
	list = []
	if (self.hasBase):
	    list.append('Base')
	for name in self.cb.keys():
	    if (self.cb[name].get()):
		list.append(name)
	return (self.customize.get(), list)
	
    def __init__(self, series):
	master = Toplevel()
	RHFrame.__init__(self, master)
	master.title("Series")
	self.createWidgets(series)
	self.pack({ 'expand' : 1, 'fill' : 'both' })

def getSeriesList():

    try:
	seriesf = open("/image/RedHat/base/series", "r")
    except default:
	print "Couldn't open /image/RedHat/base/series!"
	return (1, [])

    version = seriesf.readline()
    version = chop(version)
    if (version != '1'):
	print "Series file is version", version, "but I only understand " + \
		"version 1"
	return (1, [])

    current = None
    series = {}
    line = seriesf.readline()
    while (line):
	if ((len(line) == 0) or line[0] == '#' or line[0] == '@' or 
	    line[0] == '%'): 
	    line = seriesf.readline()
	    continue

	if (line[0] == '&'):
	    break

	while (line[0] == ' ' or [0] == '\t'):
	    line = line[1:]
	last = len(line) - 1
	while (line[last] == ' ' or [last] == '\t'):
	    last = last - 1
	    line = line[:last]

	line = chop(line)
	if (len(line)):
	    if (line == "end"):
		current = None
	    elif (current):
		series[current]['list'].append(line)
	    else:
		if (line[0] == '0'):
		    default = 0
		    line = line[2:]
		elif (line[0] == '1'):
		    default = 1
		    line = line[2:]
		else:
		    default = 0

		current = line
		series[current] = {}
		series[current]['default'] = default
		series[current]['list'] = []
	line = seriesf.readline()
    seriesf.close()

    if (len(series.keys()) == 0):
	return (1, [])

    win = PickSeriesWin(series)

    win.update()
    win.wait_window()

    doX = 0

    (customize, list) = win.getResult()
    packages = {}
    for n in list:
	if (n == "X Windows"):
	    doX = 1 
	for p in series[n]['list']:
	    packages[p] = 1

    if (doX):
	# this is magic to install the right X server

	try:
	    xserver = os.readlink("/etc/X11/X")
	except posix.error, message:
	    xserver = ""

	if (len(xserver)):
	    i = len(xserver) - 1
	else:
	    i = 0
	while (i > 0 and xserver[i] != '/'): i = i - 1

	if (xserver[(i + 1):] == "Xmetro"):
	    packages["metrox"] = 1
	else:
	    # They want an XFree server
	    if (len(xserver)):
		i = len(xserver) - 1
	    else:
		i = 0
	    while (i > 0 and xserver[i] != '_'): i = i - 1
	    
	    if (i == 0):
		rhdialog.error("I can't tell what X server you're using. "
			       "Pick one yourself during customization.");
		customize = 1
	    else:
		packages["XFree86-" + xserver[(i + 1):]] = 1
	
    return (customize, packages)
