# -*- coding: utf-8 -*-
#
# Copyright 2008 Optaros, Inc

from trac.core import implements, Component
from trac.resource import Resource

from genshi.core import QName
from genshi.builder import Element, tag

from ticketsystem.api import ITicketFieldProvider, \
                            ITicketUIWrapper, TypedTicket, TypedTicketSystem
from ticketsystem.tickettypes.util import TicketMetadataProvider

class OForgeTicketHandler(Component) :
    """
    This class adds logic for making the ticket submit buttons work and to 
    implement oforge ticket types. 
    """
    
    implements(ITicketFieldProvider, ITicketUIWrapper)
    
    # ITicketUIWrapper
    def match_for_render(self, type):
        if type in self.get_ticket_types() :
            return True
        return False
    
    def get_content_to_inject(self, req, data):
        return dict()
    
    def process_changes(self, req, ticket):
        # add in the session the redirect to new
        if req and 'submit' in req.args and req.args['submit'] == 'Save & New' :
            req.session['ticket-redirect'] = 'new'
        if req and 'submit' in req.args and req.args['submit'] == 'Save & Close' :
            req.session['ticket-redirect'] = 'query'
        if req and 'submit' in req.args and req.args['submit'] == 'Change' :
            new_data = {}
            for field in req.args.keys() :
                if field.startswith('field_') :
                    new_data[field.lstrip('field')[1:]] = req.args[field]
            req.redirect(req.href.newticket(**new_data))
        
    
    def handle_request(self, req, data, content_type):
        if data.has_key('action_controls') :
            # add class to inputs
            for key, label, action_control, hints in data['action_controls'] :
                for el in action_control.children :
                    if type(el) is Element :
                        el.attrib |= [(QName('class'), 'fieldClass-text')]
                        el.attrib |= [(QName('style'), 'width: 10em;float: none;!important')]
                        el.append(tag.br())
        if req.chrome['links'].has_key('up') :
            data['from_query'] = True
        else :
            data['from_query'] = False
        
        ticket_redirect=req.session.get('ticket-redirect', False)
        if  ticket_redirect:
            del(req.session['ticket-redirect'])
            if ticket_redirect == 'new':
                # create the get parameter
                new_data = {'type': self.get_ticket_type(),}
                # redirect to new
                req.redirect(req.href.newticket(**new_data))
            elif ticket_redirect == 'query' :
                req.redirect(req.chrome['links']['up'][0]['href'])
        
        return None, data, None

    # ITicketFieldProvider methods

    def get_fields(self, type):
        # get the relationships described in the ini file
        resource_filters = TicketMetadataProvider(self.env) \
            .get_field_filters(Resource('ticket'), type)
        if resource_filters is not None :
            return resource_filters['fields']
        
        return None

    def get_ticket_types(self):
        return self.env.config.getlist('ticket-system', 'ticket.type', [])
    
    def get_value(self, ticket, field_name):
        return None
    
