from borg.localrole.utils import replace_local_role_manager
from plone.portlets.interfaces import IPortletType
from zope.component import getUtilitiesFor
from zope.interface import Interface

from Products.CMFCore.utils import getToolByName
from Products.GenericSetup.browser.manage import ImportStepsView
from Products.GenericSetup.browser.manage import ExportStepsView

from plone.app.upgrade.utils import loadMigrationProfile


def three0_beta1(portal):
    """3.0.6 -> 3.1-beta1
    """
    out = []

    loadMigrationProfile(
        portal, 'profile-plone.app.upgrade.v31:3.0.6-3.1beta1')

    addBrowserLayer(portal, out)
    addCollectionAndStaticPortlets(portal, out)
    migratePortletTypeRegistrations(portal, out)
    removeDoubleGenericSetupSteps(portal, out)
    reinstallCMFPlacefulWorkflow(portal, out)
    replace_local_role_manager(portal)

    return out


def addBrowserLayer(portal, out):
    qi = getToolByName(portal, "portal_quickinstaller")
    if not qi.isProductInstalled("plone.browserlayer"):
        qi.installProduct("plone.browserlayer", locked=True)
        out.append("Installed plone.browserlayer")


def addCollectionAndStaticPortlets(portal, out):
    qi = getToolByName(portal, "portal_quickinstaller")
    if not qi.isProductInstalled("plone.portlet.static"):
        qi.installProduct("plone.portlet.static", locked=True)
        out.append("Installed plone.portlet.static")
    if not qi.isProductInstalled("plone.portlet.collection"):
        qi.installProduct("plone.portlet.collection", locked=True)
        out.append("Installed plone.portlet.collection")


def migratePortletTypeRegistrations(portal, out):
    for name, portletType in getUtilitiesFor(IPortletType):
        if portletType.for_ is None:
            portletType.for_ = [Interface]
        elif type(portletType.for_) is not list:
            portletType.for_ = [portletType.for_]

    out.append("Upgraded portlet types to support multiple " +
               "portlet manager interfaces.")


def removeDoubleGenericSetupSteps(portal, out):
    """Remove all GenericSetup steps that are registered both using
    zcml and in the persistent registry from the persistent registry.
    """
    st = getToolByName(portal, "portal_setup")
    view = ImportStepsView(st, None)
    steps = [step["id"] for step in view.doubleSteps()]
    if steps:
        for step in steps:
            st._import_registry.unregisterStep(step)
        st._p_changed = True
        out.append("Removed doubly registered GenericSetup import steps: %s" %
                   " ".join(steps))

    view = ExportStepsView(st, None)
    steps = [step["id"] for step in view.doubleSteps()]
    if steps:
        for step in steps:
            st._export_registry.unregisterStep(step)
        out.append("Removed doubly registered GenericSetup export steps: %s" %
                   " ".join(steps))


def reinstallCMFPlacefulWorkflow(portal, out):
    qi = getToolByName(portal, 'portal_quickinstaller', None)
    if qi is not None:
        installed = qi.isProductInstalled('CMFPlacefulWorkflow')
        if installed:
            qi.reinstallProducts(['CMFPlacefulWorkflow'])
            out.append('Reinstalled CMFPlacefulWorkflow')
