import string
from cStringIO import StringIO

from Products.Archetypes import listTypes
from Products.Archetypes.Extensions.utils import installTypes

from Products.CMFCore.utils import getToolByName
from Products.CMFCore.DirectoryView import addDirectoryViews

from Products.qSiloGroup.config import *

def removeSkin(self, layer):
    skinstool = getToolByName(self, 'portal_skins')
    for skinName in skinstool.getSkinSelections():
        original_path = skinstool.getSkinPath(skinName)
        original_path = [l.strip() for l in original_path.split(',')]
        new_path= []
        for l in original_path:
            if (l == layer) or (l.startswith(layer+'/')):
                continue
            new_path.append(l)
        skinstool.addSkinSelection(skinName, ','.join(new_path))

def setupSkin(self, out, skinFolder):

    skinstool=getToolByName(self, 'portal_skins')

    addDirectoryViews(skinstool, SKINS_DIR, GLOBALS)

    for skin in skinstool.getSkinSelections():
        path = skinstool.getSkinPath(skin)
        path = map( string.strip, string.split( path,',' ) )

        if not skinFolder in path:
            try:
                path.insert( path.index( 'custom')+1, skinFolder )
            except ValueError:
                path.append(skinFolder)
            path = string.join( path, ', ' )
            skinstool.addSkinSelection( skin, path )
            out.write('  %s layer sucessfully installed into skin %s.\n' % (skinFolder, skin))
        else:
            out.write('  %s layer was already installed into skin %s.\n' % (skinFolder, skin))

def setupActions(self, out):
    out.write("Inspecting portal_types\n")
    types_tool = getToolByName(self, 'portal_types')
    for ptype in types_tool.objectValues():
        if ptype.getId() == 'Folder':
            action_obj = ptype.getActionObject('object/edit_silo_navigation')
            if action_obj is None:
                out.write( '  Added Silo Navigation tab for %s\n' % ptype.getId() )
                ptype.addAction('edit_silo_navigation',
                                'Silo Navigation',
                                'string:${object_url}/silo_navigation_form',
                                '',
                                ('Modify portal content',),
                                'object',
                                visible=True)
            else:
                action_obj.edit(title=title, action=action,
                                condition=condition,
                                permissions=tuple(permissions),
                                visible=visible)
def removeActions(self):
    tool = getToolByName(self, 'portal_types')
    for ptype in tool.objectValues():
        if ptype.getId() == 'Folder':
            action = ptype.getActionObject('object/edit_silo_navigation')
            if action != None:
                acts = list(ptype.listActions())
                ptype.deleteActions([acts.index(a) for a in acts if a.getId()=='edit_silo_navigation'])

def setupResources(self, out):
    portal_js = getToolByName(self, 'portal_javascripts', None)
    portal_css = getToolByName(self, 'portal_css', None)

    if portal_js is not None:
        scripts = portal_js.getResourceIds()
        for script in JS:
            if script['id'] not in scripts:
                portal_js.registerScript(**script)
                print >> out, 'Registered %s script\n' % script['id']
            else:
                print >> out, 'Skipped registering of %s script\n' % script['id']

    if portal_css is not None:
        csses = portal_css.getResourceIds()
        for css in CSS:
            if css['id'] not in csses:
                portal_css.registerStylesheet(**css)
                print >> out, 'Registered %s css\n' % script['id']
            else:
                print >> out, 'Skipped registering of %s css\n' % script['id']

def install(self):
    out = StringIO()

    out.write('setupSkin... \n')
    setupSkin(self, out, PROJECTNAME)

    installTypes(self, out, listTypes(PROJECTNAME), PROJECTNAME)
    print >> out, 'Type Installed'

    setupActions(self, out)

    setupResources(self, out)

    # setup our GenericSetup profile
    setup_tool = getToolByName(self, 'portal_setup')
    setup_tool.runAllImportStepsFromProfile('profile-Products.qSiloGroup:qsilogroup')

    return out.getvalue()

def uninstall(self):
    out = StringIO()

    removeActions(self)

    removeSkin(self, PROJECTNAME)

    return out.getvalue()
