from plone.app.vocabularies.catalog import CatalogSource
from plone.supermodel.exportimport import BaseHandler
from plone.supermodel.utils import valueToElement
from z3c.relationfield.schema import RelationChoice
from z3c.relationfield.schema import RelationList
from zope import schema


class RelationChoiceBaseHandler(BaseHandler):
    filteredAttributes = BaseHandler.filteredAttributes.copy()
    filteredAttributes.update(
        {
            "portal_type": "w",
            "source": "rw",
            "vocabulary": "rw",
            "vocabularyName": "rw",
        }
    )

    def __init__(self, klass):
        super().__init__(klass)

        self.fieldAttributes["portal_type"] = schema.List(
            __name__="portal_type",
            title="Allowed target types",
            value_type=schema.Text(title="Type"),
        )

    def _constructField(self, attributes):
        portal_type = (
            attributes.get("portal_type") or attributes.get("portal_types") or []
        )
        if "portal_type" in attributes:
            del attributes["portal_type"]

        if not portal_type:
            attributes["source"] = CatalogSource()
        else:
            attributes["source"] = CatalogSource(portal_type=portal_type)

        return super()._constructField(attributes)

    def write(self, field, name, type, elementName="field"):
        element = super().write(field, name, type, elementName)
        portal_type = []

        portal_type.extend(field.source.query.get("portal_type") or [])

        if portal_type:
            attributeField = self.fieldAttributes["portal_type"]
            child = valueToElement(
                attributeField, portal_type, name="portal_type", force=True
            )
            element.append(child)

        return element


RelationChoiceHandler = RelationChoiceBaseHandler(RelationChoice)
RelationListHandler = BaseHandler(RelationList)
