# Copyright (C) 2007-2010 International Business Machines Corporation and Others. All Rights Reserved.

# Review module.
# TODO: refactor ticket manipulation items into ticketmgr.

import re

from trac.core import Component, implements
from trac.core import ComponentManager
from trac.core import TracError
from trac.util import Markup
from trac.web import IRequestHandler
from trac.web.chrome import add_stylesheet, ITemplateProvider, add_ctxtnav
from trac.versioncontrol import Changeset
from trac.web.api import IRequestFilter
from trac.wiki import wiki_to_html, wiki_to_oneliner, IWikiSyntaxProvider
            
from genshi.builder import tag
#from trac.env import IEnvironmentSetupParticipant
from trac.perm import IPermissionRequestor
from trac.config import ListOption
from icucodetools.ticketmgr import TicketManager
from pkg_resources import resource_filename #@UnresolvedImport

class ReviewModule(Component):

    implements(ITemplateProvider, IRequestFilter, IRequestHandler, IPermissionRequestor)

    # path to match for review
    path_match = re.compile(r'/icureview/([0-9]+)')

    voteable_paths = ListOption('icucodetools', 'paths', '/ticket*',
        doc='List of URL paths to show reviews on. Globs are supported.')

    # IPermissionRequestor methods
    def get_permission_actions(self):
        return ['ICUREVIEW_VIEW']

    # ITemplateProvider methods
    def get_templates_dirs(self):
        return [resource_filename(__name__, 'templates')]

    def get_htdocs_dirs(self):
        return [('icucodetools', resource_filename(__name__, 'htdocs'))]

    # IRequestFilter methods
    def pre_process_request(self, req, handler):
        if 'ICUREVIEW_VIEW' not in req.perm:
            return handler

        if self.match_ticketpage(req):
            self.render_reviewlink(req)

        return handler

    def post_process_request(self, req, template, data, content_type):
        return (template, data, content_type)

    def render_reviewlink(self, req):
        #add_stylesheet(req, 'icucodetools/css/icuxtn.css')

        els = []

        ticket_mgr = TicketManager(self.compmgr)

        db = self.env.get_db_cnx()
        repos = self.env.get_repository()
        if not repos:
            raise TracError("Could not get repository for %s" % (req.authname))

        revs = ticket_mgr.tkt2revs(self.log, db, repos, req, req.args['ticket'])

        if not revs:
            str = 'No commits.'
            li = tag.li(str)
            els.append(li)
        else:
            str = ' %d commits.' % len(revs)
            href = req.href.review(req.args['ticket'])
            a = tag.a('Review', href=href)
            li = tag.li(a + str)
            els.append(li)            
        
        ul = tag.ul(els, class_='review')
        className = ''
        title = "Reviews"
        add_ctxtnav(req, tag.span(tag.object(ul), id='icureview', title=title, class_=className))


    def match_request(self, req):
        match = re.match('/review(?:/([^/]+))?(?:/([^/]+))?(?:/(.*)$)?', req.path_info)
        if match:
            req.args['ticket'] = match.group(1)
            return True

    def match_ticketpage(self, req):
        match = re.match('/ticket(?:/([^/]+))?(?:/([^/]+))?(?:/(.*)$)?', req.path_info)
        if match:
            req.args['ticket'] = match.group(1)
            return True

    def changeToRange(self, c_new, change):
        # q: (u'trunk/Locale.java', 'file', 'add', None, u'-1')  from r3
        # q: (u'trunk/util.c',      'file', 'edit', u'trunk/util.c', u'2')  from r4
#        c_path = change[0]
#        c_itemtype = change[1]
        c_type = change[2]
        c_oldpath = change[3]
        c_old = int(change[4] or -1)
        if(c_type in (Changeset.COPY,Changeset.MOVE)):
            return (-1, c_new, c_type, c_old, c_oldpath) # ignore OLD rev for these
        elif(c_type in (Changeset.DELETE)):
            return (c_old, -1, c_type)
        else:
            return (c_old, c_new, c_type)
        
    def describeChange(self, file, change, req, db):
        what = change[2] or 'change'
        where = 'r%d:%d' % (change[0],change[1])
        if(change[0] == -1):
            if(change[1] == -1):
                url = None
                what = "noop"
                where = None
            else:
                #if change[2] == 'add+commits':
                url = req.href.browser(file, rev=change[1]) # 'add'
                where = 'r%d' % change[1]
                what = change[2]
        elif(change[1] == -1):
            url = None # deleted
            what = "deleted"
            where = None
        else:
            url = req.href.changeset(old_path=file, old=change[0], new_path=file, new=change[1])
        if url:
            what = Markup('<a href="%s">%s</a>' % (url,what))
        if where:
            return (what, tag.a(where, href=req.href.search(q=where)))
            #return (what, where)
        else:
            return (what, '')


    def process_request(self, req):
        #ok, what are we about.
        #db = self.env.get_db_cnx()
        #ticketlist = {}  # dict of ticket->???
        #revlist = {} # dict of revision->
        repos = self.env.get_repository()

        new_path = req.args.get('new_path')
        new_rev = req.args.get('new')
        old_path = req.args.get('old_path')
        old_rev = req.args.get('old')

        new_path = repos.normalize_path(new_path)
        new_rev = repos.normalize_rev(new_rev)
        old_path = repos.normalize_path(old_path)
        old_rev = repos.normalize_rev(old_rev)
        

#        if not req.perm.has_permission('TICKET_MODIFY'):
#            return req.redirect(req.href.browser())

        old_rev = int(old_rev)
        new_rev = int(new_rev)
        
        ticket = req.args.get('ticket')
        try:
            ticket = int(ticket)
        except Exception:
            ticket = 0
#        req.hdf['review.ticket'] = ticket
#        req.hdf['review.tickethtml'] = tag.a(ticket, req.href.ticket(ticket))

        data = {}

        data['overall_y'] = 0
        data['ticket_id'] = req.args['ticket']
        data['ticket_href'] = req.href.ticket(req.args['ticket'])

        ticket_mgr = TicketManager(self.compmgr)

        db = self.env.get_db_cnx()
        repos = self.env.get_repository()

        revs = ticket_mgr.tkt2revs(self.log, db, repos, req, req.args['ticket'])
        
        if (not revs or len(revs)==0):
            # nothing to review. shouldn't happen
            return ('nothing.html', data, 'text/html')
        elif(len(revs)==1):
            # only one change - just do a changeset view
            return req.redirect(req.href.changeset(revs[0]))

        revcount = 0
        branches = {}
        files = {}
        # may be 0 revs.
        revisions = []
        
        for rev in revs:
            chgset = repos.get_changeset(rev)
            # q: (u'trunk/Locale.java', 'file', 'add', None, u'-1')  from r3
            # q: (u'trunk/util.c', 'file', 'edit', u'trunk/util.c', u'2')  from r4
            message = chgset.message or '--'
            revcount = revcount + 1
            revision = {}
            revision['rev'] =  tag.a(rev, req.href.changeset(rev))
            revision['num'] =  rev
            revision['comment'] =  message #wiki_to_oneliner( message, self.env, db, shorten=False )
            for chg in chgset.get_changes():
                path = chg[0]
                if path in files:
                    item = files[path]
                else:
                    item = []
                    files[path] = item;
                item.append(self.changeToRange(rev,chg))
            revisions.append(revision)
        data['revisions'] = revisions
        
        if(revcount > 0):
            data['revcount'] = revcount
        
        # print "files: %d" % len(files)
        # go throuhg each file and calculate its minimum range
        filelist = files.keys()
        filelist.sort()
#        print 'bar to %d len of %s' % (len(filelist),str(filelist))
        for file in filelist:
            changes = files[file]
            i = 0
#            print " looping from %d to %d over %d " % (i,len(changes)-1,len(changes))
            while len(changes)>1 and i<(len(changes)-1):
                if changes[i][1] == changes[i+1][0]:
                    if changes[i][0] == -1:
                        changes[i+1] = (changes[i][0],changes[i+1][1],'add+commits') # retain 'first' rev
                    else:
                        changes[i+1] = (changes[i][0],changes[i+1][1],'multiple commits') # retain 'first' rev

                    changes = changes[:i] + changes[i+1:] # and shift down
#                    print "merged: %s" % str(changes)
                    files[file] = changes
                else:
                    i = i + 1
        
        # now, write 'em out
        sera = 0
        #files_data = []
        for file in filelist:
            sera = sera+1
            file_data = {}
            file_data['name'] = Markup('<a href="%s">%s</a>' % (req.href.browser(file),file))
            branch_name = '/'.join(file.split('/')[0:2])
            #print "branch is: (%s)" % (branch_name)
            branches_data = branches.get(branch_name, {})
            files_data = branches_data.get('files',[])

            changes = files[file]
            cha = 0
            changes_data = []
            for change in changes:
                cha = cha + 1
#                print "%s output %s " % (file, str(change))
                changes_data.append(self.describeChange(file, change, req, db))
            file_data['changes'] = changes_data
            if(len(changes)>1):
                whathtml = self.describeChange(file, (changes[0][0], changes[len(changes)-1][1], 'overall'), req, db)
                file_data['overall'] = whathtml
                file_data['overall_y'] = 1
                data['overall_y'] = 1
            else:
                file_data['overall_y'] = 0
            files_data.append(file_data)
            # sets
            branches_data['files'] = files_data
            branches_data['len'] = len(files_data)
            branches_data['name'] = branch_name
            branches[branch_name] = branches_data
        #data['files'] = files_data
        #data['branches'] = branches

        # .. convert dict to array.
        branch_list = []
        for branch in branches:
            branch_list.append(branches[branch])
        data['branches'] = branch_list
        data['lastbranch'] = branch
        data['branchcount'] = len(branches)
        
        content_type = "text/html"
        add_stylesheet(req, 'icucodetools/css/icuxtn.css')
        return 'review.html', data, content_type

