#!/usr/bin/env python

import string
import os
import sys

from PackageGroup import PackageGroup
from Package import Package

CONFIG="msm.conf"

GROUP_SIGNIFIER='group:'
PACKAGE_SIGNIFIER='package:'

class PackageConfig:
    def __init__(self):
        self.name = 'The Me Software Map'
        self.description = ''
        self.host = None

        self.packageGroupList = []
        self.packageGroupMap = {}
        self.packageMap = {}

        path = ''
        self.readConfig()

    def readConfig(self):
        if os.path.exists(CONFIG):
            file = open(CONFIG)
        else:
            for path in sys.path:                        
                p = os.path.join(path, CONFIG)
                if os.path.exists(p):
                    file = open(p)
        curObj = self
        startedDescription = 0
        for line in file.readlines():
            if line[0] != '#':                
                if line[:len(GROUP_SIGNIFIER)] == GROUP_SIGNIFIER:
                    #A new group is defined
                    curObj = PackageGroup(line[len(GROUP_SIGNIFIER):-1])
                    startedDescription = 0
                    self.packageGroupList.append(curObj)
                    self.packageGroupMap[curObj.name] = curObj
                    package = None
                elif line[:len(PACKAGE_SIGNIFIER)] == PACKAGE_SIGNIFIER:
                    #A new package is defined
                    curObj = Package(line[len(PACKAGE_SIGNIFIER):-1])
                    startedDescription = 0
                    self.packageMap[curObj.name] = curObj
                else:
                    if not startedDescription:
                        i = string.find(line, ':')
                        if i > 0:
                            #We are setting an attribute
                            (name, value) = string.split(line[:-1], ':', 1)
                            setattr(curObj, name, value)
                        else:
                           curObj.description = curObj.description + line
                           startedDescription = 1                        
                    else:                    
                        #We are appending to the object's description
                        curObj.description = curObj.description + line
                        startedDescription = 1

        for package in self.packageMap.values():
            for groupName in package.getGroupNames():
                group = self.packageGroupMap[groupName]
                group.addPackage(package)
                package.addGroup(group)

        for group in self.packageGroupList:
            group.packages.sort(cmpPackage)

    def getFooter(self):
        return getattr(self, 'footer', '')

    def selfTest(self):
        for group in self.packageGroupList:
            group.selfTest()

def cmpPackage(a,b):
    "Compare two packages alphabetically by case-insensitive name"
    return cmp(string.lower(a.name), string.lower(b.name))

if __name__ == '__main__':
    PackageConfig().selfTest()
    
