##############################################################################
#
# Copyright (c) 2002 Nexedi SARL and Contributors. All Rights Reserved.
#                    Jean-Paul Smets-Solanes <jp@nexedi.com>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
#
##############################################################################

from Products.ERP5Type.Utils import assertAttributePortalType
from AccessControl import ClassSecurityInfo
from Products.ERP5Type import Permissions, PropertySheet, Constraint, Interface
from Products.CMFCore.WorkflowCore import WorkflowMethod
from Products.CMFCore.utils import getToolByName

class Entity:
    """
        Mix-in class used by Organisation and Person

        Implements accessors to:

        - default_telephone

        - default_fax

        - default_email

        - default_address
    """
    meta_type = 'ERP5 Entity'

    # Declarative security
    security = ClassSecurityInfo()
    security.declareObjectProtected(Permissions.AccessContentsInformation)

    security.declareProtected(Permissions.View, 'getDefaultAddressText')
    def getDefaultAddressText(self):
        """
          Returns the default address as a text string
        """
        try:
          return self.getDefaultAddressValue().asText()
        except AttributeError:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultAddressStreetAddress')
    def getDefaultAddressStreetAddress(self):
        """
          Returns the default address street as a text string
        """
        try:
          return self.getDefaultAddressValue().getStreetAddress()
        except AttributeError:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultAddressCity')
    def getDefaultAddressCity(self):
        """
          Returns the default address city as a text string
        """
        try:
          return self.getDefaultAddressValue().getCity()
        except AttributeError:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultAddressRegion')
    def getDefaultAddressRegion(self):
        """
          Returns the default address region as a text string
        """
        try:
         return self.getDefaultAddressValue().getRegion()
        except AttributeError:
         return ''

    security.declareProtected(Permissions.View, 'getDefaultAddressZipCode')
    def getDefaultAddressZipCode(self):
        """
          Returns the default address zip code as a text string
        """
        try:
          return self.getDefaultAddressValue().getZipCode()
        except AttributeError:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultTelephoneText')
    def getDefaultTelephoneText(self):
        """
          Returns the default telephone as a text string
        """
        try:
          return self.getDefaultTelephone().asText()
        except AttributeError:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultTelephoneNumber')
    def getDefaultTelephoneNumber(self):
        """
          Returns the default telephone number
        """
        try:
          return self.getDefaultTelephone().getTelephoneNumber()
        except AttributeError:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultFaxText')
    def getDefaultFaxText(self):
        """
          Returns the default fax as a text string
        """
        try:
          return self.getDefaultFax().asText()
        except AttributeError:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultFaxNumber')
    def getDefaultFaxNumber(self):
        """
          Returns the default fax number
        """
        try:
          return self.getDefaultFax().getTelephoneNumber()
        except AttributeError:
          return ''

    security.declareProtected(Permissions.View, 'getDefaultEmailText')
    def getDefaultEmailText(self):
        """
          Returns the default email as a text string
        """
        try:
          return self.getDefaultEmail().asText()
        except AttributeError:
          return ''

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultAddress')
    def setDefaultAddress(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultAddress(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultAddressText')
    def setDefaultAddressText(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultAddressText(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultAddressRegion')
    def setDefaultAddressRegion(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultAddressRegion(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultAddressCity')
    def setDefaultAddressCity(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultAddressCity(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultAddressZipCode')
    def setDefaultAddressZipCode(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultAddressZipCode(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultAddressStreetAddress')
    def setDefaultAddressStreetAddress(self, coordinate):
        """
          Updates the default address from a standard text string
        """
        self._setDefaultAddressStreetAddress(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultTelephoneText')
    def setDefaultTelephoneText(self, coordinate):
        """
          Updates the default telephone from a standard text string
        """
        self._setDefaultTelephoneText(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultTelephoneNumber')
    def setDefaultTelephoneNumber(self, coordinate):
        """
          Updates the default telephone number
        """
        self._setDefaultTelephoneNumber(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultFaxText')
    def setDefaultFaxText(self, coordinate):
        """
          Updates the default fax from a standard text string
        """
        self._setDefaultFaxText(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultFaxNumber')
    def setDefaultFaxNumber(self, coordinate):
        """
          Updates the default fax number
        """
        self._setDefaultFaxNumber(coordinate)
        self.reindexObject()

    security.declareProtected(Permissions.ModifyPortalContent, 'setDefaultEmailText')
    def setDefaultEmailText(self, coordinate):
        """
          Updates the default email from a standard text string
        """
        self._setDefaultEmailText(coordinate)
        self.reindexObject()


    ### Private methods - no reindexing

    security.declarePrivate('_setDefaultAddress')
    def _setDefaultAddress(self, coordinate):
        assertAttributePortalType(self, 'default_address', 'Address')
        if not hasattr(self,'default_address'):
          self.invokeFactory( type_name='Address'
                            , id='default_address'
                            )
        self.default_address = coordinate

    security.declarePrivate('_setDefaultAddressText')
    def _setDefaultAddressText(self, coordinate):
        assertAttributePortalType(self, 'default_address', 'Address')
        if not hasattr(self,'default_address'):
          self.invokeFactory( type_name='Address'
                            , id='default_address'
                            )
        self.default_address.fromText(coordinate)

    security.declarePrivate('_setDefaultAddressCity')
    def _setDefaultAddressCity(self, value):
        assertAttributePortalType(self, 'default_address', 'Address')
        if not hasattr(self,'default_address'):
          self.invokeFactory( type_name='Address'
                            , id='default_address'
                            )
        self.default_address.setCity(value)

    security.declarePrivate('_setDefaultAddressZipCode')
    def _setDefaultAddressZipCode(self, value):
        assertAttributePortalType(self, 'default_address', 'Address')
        if not hasattr(self,'default_address'):
          self.invokeFactory( type_name='Address'
                            , id='default_address'
                            )
        self.default_address.setZipCode(value)

    security.declarePrivate('_setDefaultAddressStreetAddress')
    def _setDefaultAddressStreetAddress(self, value):
        assertAttributePortalType(self, 'default_address', 'Address')
        if not hasattr(self,'default_address'):
          self.invokeFactory( type_name='Address'
                            , id='default_address'
                            )
        self.default_address.setStreetAddress(value)

    security.declarePrivate('_setDefaultAddressRegion')
    def _setDefaultAddressRegion(self, value):
        assertAttributePortalType(self, 'default_address', 'Address')
        if not hasattr(self,'default_address'):
          self.invokeFactory( type_name='Address'
                            , id='default_address'
                            )
        self.default_address.setRegion(value)

    security.declarePrivate('_setDefaultTelephoneText')
    def _setDefaultTelephoneText(self, coordinate):
        assertAttributePortalType(self, 'default_telephone', 'Telephone')
        if not hasattr(self,'default_telephone'):
          self.invokeFactory( type_name='Telephone'
                            , id='default_telephone'
                            )
        self.default_telephone.fromText(coordinate)

    security.declarePrivate('_setDefaultTelephoneNumber')
    def _setDefaultTelephoneNumber(self, coordinate):
        assertAttributePortalType(self, 'default_telephone', 'Telephone')
        if not hasattr(self,'default_telephone'):
          self.invokeFactory( type_name='Telephone'
                            , id='default_telephone'
                            )
        self.default_telephone.setTelephoneNumber(coordinate)

    security.declarePrivate('_setDefaultFaxText')
    def _setDefaultFaxText(self, coordinate):
        assertAttributePortalType(self, 'default_fax', 'Fax')
        if not hasattr(self,'default_fax'):
          self.invokeFactory( type_name='Fax'
                            , id='default_fax'
                            )
        self.default_fax.fromText(coordinate)

    security.declarePrivate('_setDefaultFaxNumber')
    def _setDefaultFaxNumber(self, coordinate):
        assertAttributePortalType(self, 'default_fax', 'Fax')
        if not hasattr(self,'default_fax'):
          self.invokeFactory( type_name='Fax'
                  , id='default_fax'
                  )
        self.default_fax.setTelephoneNumber(coordinate)

    security.declarePrivate('_setDefaultEmailText')
    def _setDefaultEmailText(self, coordinate):
        assertAttributePortalType(self, 'default_email', 'Email')
        if not hasattr(self,'default_email'):
          self.invokeFactory( type_name='Email'
                            , id='default_email'
                            )
        self.default_email.fromText(coordinate)