#!/usr/bin/python
# -*- coding: utf-8 -*-

# Gökmen Göksel <gokmen@pardus.org.tr> 2010, LGPLv3

HEADER = """<?xml version="1.0" ?>
<!DOCTYPE PISI SYSTEM "http://www.pardus.org.tr/projeler/pisi/pisi-spec.dtd">"""

def yaml2xml(target):
    import yaml
    import piksemel

    ACCEPTED_KEYS = ('path', 'package', 'file')
    pspec = yaml.load(file(target).read())
    pik = piksemel.newDocument('PISI')

    for tag_key_1 in pspec.iterkeys():
        tag_1 = pik.insertTag(tag_key_1)
        for tag_key_2 in pspec[tag_key_1].iterkeys():
            tag_data_2 = pspec[tag_key_1][tag_key_2]
            if not type(tag_data_2) == list:
                tag_2 = tag_1.insertTag(tag_key_2)
            if type(tag_data_2) in (str, unicode):
                tag_2.setData(tag_data_2)
            elif type(tag_data_2) == dict:
                for tag_key_3 in pspec[tag_key_1][tag_key_2]:
                    tag_data_3 = pspec[tag_key_1][tag_key_2][tag_key_3]
                    if not type(tag_data_3) in (list, dict):
                        if tag_key_3 in ACCEPTED_KEYS:
                            tag_2.setData(unicode(tag_data_3))
                        elif tag_key_3[0].islower():
                            tag_2.setAttribute(tag_key_3, unicode(tag_data_3))
                        else:
                            tag_3 = tag_2.insertTag(tag_key_3)
                            tag_3.setData(unicode(tag_data_3))
                    else:
                        for tag_data_4 in tag_data_3:
                            for tag_key_4 in tag_data_4.iterkeys():
                                if tag_key_4 in ACCEPTED_KEYS:
                                    tag_3 = tag_2.insertTag(tag_key_3)
                                    tag_3.setData(unicode(tag_data_4[tag_key_4]))
                                elif tag_key_4[0].islower():
                                    tag_3.setAttribute(tag_key_4, unicode(tag_data_4[tag_key_4]))
            elif type(tag_data_2) == list:
                for tag_data_3 in tag_data_2:
                    tag_2 = tag_1.insertTag(tag_key_2)
                    for tag_key_3 in tag_data_3.iterkeys():
                        if tag_key_3[0].islower():
                            tag_2.setAttribute(tag_key_3, unicode(tag_data_3[tag_key_3]))
                        else:
                            tag_3 = tag_2.insertTag(tag_key_3)
                            tag_3.setData(unicode(tag_data_3[tag_key_3]))

    return HEADER + pik.toPrettyString()

if __name__ == '__main__':
    import os
    import sys

    yamlFile = filter(lambda x:x.endswith('.yaml'), sys.argv)
    if yamlFile:
        yamlFile = yamlFile[0]
        xmlFilePath = '.%s.xml' % yamlFile.split('.')[0].split('/')[-1]
        print 'Yaml file found, before processing it with pisi it will be converted to ', xmlFilePath

        xmlFile = file(xmlFilePath, 'w')
        xmlFile.write(yaml2xml(yamlFile))
        xmlFile.close()

        sys.argv[sys.argv.index(yamlFile)] = xmlFilePath

    os.system('pisi %s' % ' '.join(sys.argv[1:]))
    # os.unlink('.pspec.xml')


