from django.core.management.base import BaseCommand
from django.test.client import Client
import os, sys, re
import requests
from django.conf import settings

# pylint: disable=E1103
# Instance of 'WSGIRequest' has no 'status_code' member
# (but some types could not be inferred) (maybe-no-member)


class Command(BaseCommand):
    help    = "Test the response time for all toaster urls"

    def handle(self, *args, **options):
	root_urlconf = __import__(settings.ROOT_URLCONF)
	patterns = root_urlconf.urls.urlpatterns
	global full_url
	for pat in patterns:
	    if pat.__class__.__name__ == 'RegexURLResolver':
		url_root_res = str(pat).split('^')[1].replace('>', '')
		if 'gui' in url_root_res:
		    for url_patt in pat.url_patterns:
			full_url = self.get_full_url(url_patt, url_root_res)
			info = self.url_info(full_url)
			status_code = info[0]
			load_time = info[1]
			print 'Trying \'' + full_url + '\', ' + str(status_code) + ', ' + str(load_time)

    def get_full_url(self, url_patt, url_root_res):
	full_url = str(url_patt).split('^')[1].replace('$>', '').replace('(?P<file_path>(?:/[', '/bin/busybox').replace('.*', '')
	full_url = str(url_root_res + full_url)
	full_url = re.sub('\(\?P<.*?>\\\d\+\)', '1', full_url)
	full_url = 'http://localhost:8000/' + full_url
	return full_url

    def url_info(self, full_url):
	client = Client()
	info = []
	try:
	    resp = client.get(full_url, follow = True)
	except Exception as e_status_code:
            self.error('Url: %s, error: %s' % (full_url, e_status_code))
            resp = type('object', (), {'status_code':0, 'content': str(e_status_code)})
	status_code = resp.status_code
	info.append(status_code)
	try:
	    req = requests.get(full_url)
	except Exception as e_load_time:
            self.error('Url: %s, error: %s' % (full_url, e_load_time))
	load_time = req.elapsed
	info.append(load_time)
	return info

    def error(self, *args):
	for arg in args:
	    print >>sys.stderr, arg,
	print >>sys.stderr
