import os
from django.conf import urls
from django.views import generic


def generate_patterns(django_name, gwt_name):
    """
    Generates the common URL patterns for the given names

    @param django_name the full name of the Django application
                       (e.g., frontend.afe)
    @param gwt_name the name of the GWT project (e.g., AfeClient)
    @return the common standard and the debug pattern lists, as a tuple
    """

    pattern_list = urls.patterns(
            django_name,
            (r'^(?:|noauth/)rpc/', 'views.handle_rpc'),
            (r'^rpc_doc', 'views.rpc_documentation'),
        )

    debug_pattern_list = urls.patterns('',
            # for GWT hosted mode
            (r'^(?P<forward_addr>autotest.*)',
             'autotest_lib.frontend.afe.views.gwt_forward'),

            # for GWT compiled files
            (r'^client/(?P<path>.*)$', 'django.views.static.serve',
             {'document_root': os.path.join(os.path.dirname(__file__), '..',
                                            'frontend', 'client', 'www')}),
            # redirect / to compiled client
            (r'^$', generic.RedirectView.as_view(
                    url='client/autotest.%(name)s/%(name)s.html'
                    % dict(name=gwt_name))),
        )

    return (pattern_list, debug_pattern_list)
