##############################################################################
#
# Copyright (c) 2002 Nexedi SARL and Contributors. All Rights Reserved.
#                    Mikael Barbero <mikael@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.Formulator import Widget, Validator
from Products.Formulator.Field import ZMIField
from Products.Formulator.DummyField import fields
from Products.ERP5Type.Utils import convertToUpperCase
from Products.CMFCore.utils import getToolByName

from Products.PageTemplates.PageTemplateFile import PageTemplateFile

from Globals import get_request
from Products.PythonScripts.Utility import allow_class

from Products.PythonScripts.standard import url_quote_plus

import string

from zLOG import LOG

class POSBoxWidget(Widget.Widget):
  """
  A widget that display a point of sales UI.
  """
  
  property_names = Widget.Widget.property_names + [
    'html_ZPT', \
    'javascript_ZPT', \
    'css_ZPT', \
    'getResourceByReference_ZPT', \
    'createOrder_script', \
    'portal_types', \
    'display_fastResourceEntry', \
    'portal_type_fastResourceEntry', \
    'resource_category_fastResourceEntry', \
    'barcodeStartString', \
    'pos_layout', \
    'barcodeStopString', \
    'display_bgcolor', \
    'display_txtcolor', \
    'order_summary_aLine', \
    'order_summary_anotherLine'
  ]

  default = fields.StringField(
                                'default',
                                title='Default',
                                description=(
    "Default value of the text in the widget."),
                                default="",
                                required=0)

  html_ZPT = fields.StringField(
                                'html_ZPT',
                                title='Page Template for HTML',
                                description=(
    "Page Template for generating POSBox UI HTML"),
                                default="POSBox",
                                required=1)

  javascript_ZPT = fields.StringField(
                                'javascript_ZPT',
                                title='Page Template for JavaScript',
                                description=(
    "Page Template for generating JavaScript's options"),
                                default="POSBox_js",
                                required=1)

  css_ZPT = fields.StringField(
                                'css_ZPT',
                                title="Page Template for CSS",
                                description=(
      "Page Template for generating dynamic CSS"),
                                default="POSBox_css",
                                required=1)

  getResourceByReference_ZPT = fields.StringField(
                                'getResourceByReference_ZPT',
                                title="Page Template for generating resource's XML",
                                description=(
    "Page template which generates the XML of the resource when asking for a referencce"),
                                default="getResourceByReference",
                                required=1)

  createOrder_script = fields.StringField(
                                'createOrder_script',
                                title="Python script for creating the order",
                                description=(
    "Python script which create the order from the XML sended by POS"),
                                default="createOrder",
                                required=1)
  
  display_fastResourceEntry = fields.ListField(
                                'display_fastResourceEntry',
                                title='Display Fast Resource Entry Block',
                                description=(
    "Is the fast resource entry block displayed ?"),
                                default='False',
                                items=['True', 'False'],
                                size=1,
                                required=1,
                                group="Fast Product Entry")
  
  portal_type_fastResourceEntry = fields.StringField(
                                'portal_type_fastResourceEntry',
                                title='Portal Type of resources',
                                description=(
    "What is the portal type of resources in fast resource entry block"),
                                default='',
                                required=0,
                                group="Fast Product Entry")
                                
  
  portal_types = fields.ListTextAreaField(
                                'portal_types',
                                title='Portal Types',
                                description=(
    "The allowed resource to be requested by reference. Required."),
                                default=[],
                                required=1)

  resource_category_fastResourceEntry = fields.StringField(
                                'resource_category_fastResourceEntry',
                                title='Top level Resource Category',
                                description=(
    "The ProductLine that is a the top level of fast resource entry"),
                                default='',
                                required=0,
                                group="Fast Product Entry")
  
  pos_layout = fields.ListField(
                                'pos_layout',
                                title='Layout',
                                description=(
    "How is the layout organised"),
                                default='',
                                items=[
                                    'Summary of the order on the left' 
                                    , 'Summary of the order on the right'
                                  , ],
                                size=1,
                                required=1)
    
  barcodeStartString = fields.StringField(
                                'barcodeStartString',
                                title='Barcode Prefix String',
                                description=(
    "The string which is prefixed by the barcode while reading"),
                                default="#",
                                required=1,
                                group="barcode")

  barcodeStopString = fields.StringField(
                                'barcodeStopString',
                                title='Barcode Suffix String',
                                description=(
    "The string which is prefixed by the barcode while reading"),
                                default="#",
                                required=1,
                                group="barcode")

  display_bgcolor = fields.StringField(
                                'display_bgcolor',
                                title='Background color',
                                description=(
    "Color in html hex format (#000000 by ex.)"),
                                default="#ffffcc",
                                required=0,
                                group="display area")

  display_txtcolor = fields.StringField(
                                'display_txtcolor',
                                title='Text color',
                                description=(
    "Color in html hex format (#000000 by ex.)"),
                                default="#000000",
                                required=0,
                                group="display area")

  order_summary_aLine = fields.StringField(
                                'order_summary_aLine',
                                title="Order line background color 1",
                                description=(
    "Background color of a order line in order summary view"),
                                default="#e3e3e3",
                                required=0,
                                group="order summary")
    
  order_summary_anotherLine = fields.StringField(
                                'order_summary_anotherLine',
                                title="Order line background color 2",
                                description=(        
    "Background color of another order line in order summary view"),
                                default="#ffffff",
                                required=0,
                                group="order summary")
 
  def render(self, field, key, value, REQUEST, render_prefix=None):
    """
      Render point of sales widget.
    """
    here = REQUEST['here']
    page_template = getattr(here,field.get_value("html_ZPT"))

    return "<!-- Generated by render -->\n%s" % page_template()

  def render_css(self, field, key, value, REQUEST):
    here = REQUEST['here']
    page_template = getattr(here,field.get_value("css_ZPT"))
    
    return "<!-- Generated by render_css  -->\n%s" % page_template(
        display_txtcolor = field.get_value("display_txtcolor"),
        display_bgcolor = field.get_value("display_bgcolor"),
        pos_layout_left = (field.get_value("pos_layout") == 'Summary of the order on the left'),
        order_summary_aLine = field.get_value("order_summary_aLine"),
        order_summary_anotherLine = field.get_value("order_summary_anotherLine"),
        fastResourceEntry_display = field.get_value("display_fastResourceEntry"),
        )

  def render_javascript(self, field, key, value, REQUEST, render_prefix=None):
    here = REQUEST['here']
    page_template = getattr(here,field.get_value("javascript_ZPT"))

    

    return "<!-- Generated by render_javascript -->\n%s" % page_template(
        getResourceByReference_ZPT = field.get_value('getResourceByReference_ZPT'),
        createOrder_script = field.get_value('createOrder_script'),
        portal_types = "portal_type:list=" + "&portal_type:list=".join([url_quote_plus(x[0]) for x in field.get_value('portal_types')]),
        barcodeStartString = field.get_value('barcodeStartString'),
        barcodeStopString = field.get_value('barcodeStopString'),
        fastResourceEntry_display = field.get_value("display_fastResourceEntry"),
        portal_type_fastResourceEntry = field.get_value('portal_type_fastResourceEntry'),
        resource_category_fastResourceEntry = field.get_value('resource_category_fastResourceEntry')
        ) 

  def render_view(self, field, value, REQUEST=None, render_prefix=None):
    """ 
      Render point of sales widget
    """
    return "<p>Generated by render_view</p>"

class POSBoxValidator(Validator.Validator):
  """
    No need to validate POSBox as input is controlled by client side's javascript
  """
  property_names = Validator.Validator.property_names

  def validate(self, field, key, REQUEST):
    return None

POSBoxWidgetInstance = POSBoxWidget()
POSBoxValidatorInstance = POSBoxValidator()

class POSBox(ZMIField):
  meta_type = "POSBox"

  widget = POSBoxWidgetInstance
  validator = POSBoxValidatorInstance

  def render_css(self, value=None, REQUEST=None):
    return self.widget.render_css(self,'',value,REQUEST)

  def render_javascript(self, value=None, REQUEST=None, render_prefix=None):
    return self.widget.render_javascript(self,'',value,REQUEST)