import datetime, sets
from django import newforms as forms
from django.newforms import *
from django.template import Context, loader
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render_to_response
from surftrackr.log.models import *
from surftrackr.log.views import pref_days_ago, get_general_setting
from surftrackr.httpauth.models import *
from surftrackr.preferences.models import *
from surftrackr.wordsearch.models import *
from django.contrib.admin.models import LogEntry
from django.conf import settings
from pygooglechart import *
from decimal import Decimal

TWOPLACES = Decimal(10) ** -2

def make_menu(group_id):
    graphs = [
        ('Bytes per user', '/graphs/group/' + str(group_id) + '/bytes/'),
        ('Visits per user', '/graphs/group/' + str(group_id) + '/visits/'),
        ('Sites per user', '/graphs/group/' + str(group_id) + '/sites/'),
    ]

    return graphs

def check_size_ok(chart_type, groups_obj):
    pass


def show_groups(request):
    duser_obj = http_login(request)
    all_groups_obj = UserGroup.objects.all()
    groups_obj = []
    for g in all_groups_obj:
        if len(g.users.all()) > 0: groups_obj.append(g)

    message = '<a href="/">Main Page</a> &rarr; Graphs: Select Group'
    return render_to_response('graphs/list_groups.html', locals())


def show_group_graph(request, group_id):
    duser_obj = http_login(request)
    group_obj = get_object_or_404(UserGroup, pk=group_id)
    graphs_obj = make_menu(group_id)
    draw_chart = False

    message = '<a href="/">Main Page</a> &rarr; <a href="/graphs/listgroups/">Graphs: Select Group</a> &rarr; Select Graph for ' + str(group_obj)
    return render_to_response('graphs/select_graph.html', locals())


def show_group_graph_bytes(request, group_id, chart_type):
    duser_obj = http_login(request)
    group_obj = get_object_or_404(UserGroup, pk=group_id)
    graphs_obj = make_menu(group_id)
    days_ago = get_general_setting(request).days_ago

    if (duser_obj.is_superuser or settings.DISABLE_AUTH):
        users_obj = group_obj.users.all()
    else:
        users_obj = group_obj.users.filter(managed_by=duser_obj)

    total_bytes = 0
    for user in users_obj:
        bytes = sum([u.size for u in user.weblog_set.filter(log_datetime__gt=pref_days_ago(request))])
        total_bytes += bytes
        user.total_bytes = bytes

    if (chart_type == 'pie2d'):
        chart = PieChart2D(600, 400)
    elif (chart_type == 'pie3d'):
        chart = PieChart3D(750, 400)
    elif (chart_type == 'bar-vert'):
        chart = GroupedVerticalBarChart(100 * (len(users_obj)+1) + 100, 300)

    for user in users_obj:
        user.percent_bytes = 0
        if user.total_bytes > 0:
            user.percent_bytes = int(user.total_bytes / float(total_bytes) * 100)
            draw_chart = True

    chart.add_data([u.percent_bytes for u in users_obj])
    chart.set_title('Bytes - ' + str(group_obj))

    if (chart_type == 'pie2d'):
        chart.set_pie_labels([str(u) + ' (' + str(u.percent_bytes) + '%)' for u in users_obj])
    elif (chart_type == 'pie3d'):
        chart.set_pie_labels([str(u) + ' (' + str(u.percent_bytes) + '%)' for u in users_obj])
    elif (chart_type == 'bar-vert'):
        chart.set_bar_width(60)
        chart.set_axis_labels(Axis.LEFT, ['0', str(Decimal(str(total_bytes/2000000.0)).quantize(TWOPLACES)) + ' Mb'])
        users_obj_reverse = [str(u) for u in users_obj]
        users_obj_reverse.reverse()
        chart.set_axis_labels(Axis.BOTTOM, [str(u) for u in users_obj])

    google_chart = chart.get_url()

    message = '<a href="/">Main Page</a> &rarr; <a href="/graphs/listgroups/">Graphs: Select Group</a> &rarr; Select Graph for ' + str(group_obj)
    return render_to_response('graphs/select_graph.html', locals())


def show_group_graph_visits(request, group_id, chart_type):
    duser_obj = http_login(request)
    group_obj = get_object_or_404(UserGroup, pk=group_id)
    graphs_obj = make_menu(group_id)
    days_ago = get_general_setting(request).days_ago

    if (duser_obj.is_superuser or settings.DISABLE_AUTH):
        users_obj = group_obj.users.all()
    else:
        users_obj = group_obj.users.filter(managed_by=duser_obj)

    total_visits = 0

    for user in users_obj:
        visits = len([u for u in user.weblog_set.all().filter(log_datetime__gt=pref_days_ago(request))])
        total_visits += visits
        user.total_visits = visits

    if (chart_type == 'pie2d'):
        chart = PieChart2D(600, 400)
    elif (chart_type == 'pie3d'):
        chart = PieChart3D(750, 400)
    elif (chart_type == 'bar-vert'):
        chart = GroupedVerticalBarChart((100 * (len(users_obj)+1)) + 100, 300)

    for user in users_obj:
        user.percent_visits = 0
        if user.total_visits > 0:
            user.percent_visits = int(user.total_visits / float(total_visits) * 100)
            draw_chart = True

    chart.add_data([u.percent_visits for u in users_obj])
    chart.set_title('URLs - ' + str(group_obj))

    if (chart_type == 'pie2d'):
        chart.set_pie_labels([str(u) + ' (' + str(u.percent_visits) + '%)' for u in users_obj])
    elif (chart_type == 'pie3d'):
        chart.set_pie_labels([str(u) + ' (' + str(u.percent_visits) + '%)' for u in users_obj])
    elif (chart_type == 'bar-vert'):
        chart.set_bar_width(60)
        chart.set_axis_labels(Axis.LEFT, ['0', str(int(total_visits/2.0))])
        users_obj_reverse = [str(u) for u in users_obj]
        users_obj_reverse.reverse()
        chart.set_axis_labels(Axis.BOTTOM, [str(u) for u in users_obj])

    google_chart = chart.get_url()

    message = '<a href="/">Main Page</a> &rarr; <a href="/graphs/listgroups/">Graphs: Select Group</a> &rarr; Select Graph for ' + str(group_obj)
    return render_to_response('graphs/select_graph.html', locals())


def show_group_graph_sites(request, group_id, chart_type):
    duser_obj = http_login(request)
    group_obj = get_object_or_404(UserGroup, pk=group_id)
    graphs_obj = make_menu(group_id)
    days_ago = get_general_setting(request).days_ago

    if (duser_obj.is_superuser or settings.DISABLE_AUTH):
        users_obj = group_obj.users.all()
    else:
        users_obj = group_obj.users.filter(managed_by=duser_obj)

    total_sites = 0
    for user in users_obj:
        sites = len(set([u.website.name for u in user.weblog_set.all().filter(log_datetime__gt=pref_days_ago(request))]))
        total_sites += sites
        user.total_sites = sites

    if (chart_type == 'pie2d'):
        chart = PieChart2D(600, 400)
    elif (chart_type == 'pie3d'):
        chart = PieChart3D(750, 400)
    elif (chart_type == 'bar-vert'):
        chart = GroupedVerticalBarChart(100 * (len(users_obj)+1) + 100, 300)

    for user in users_obj:
        user.percent_sites = 0
        if user.total_sites > 0:
            user.percent_sites = int(user.total_sites / float(total_sites) * 100)
            draw_chart = True

    chart.add_data([u.percent_sites for u in users_obj])
    chart.set_title('Sites - ' + str(group_obj))

    if (chart_type == 'pie2d'):
        chart.set_pie_labels([str(u) + ' (' + str(u.percent_sites) + '%)' for u in users_obj])
    elif (chart_type == 'pie3d'):
        chart.set_pie_labels([str(u) + ' (' + str(u.percent_sites) + '%)' for u in users_obj])
    elif (chart_type == 'bar-vert'):
        chart.set_bar_width(60)
        chart.set_axis_labels(Axis.LEFT, ['0', str(int(total_sites/2.0))])
        users_obj_reverse = [str(u) for u in users_obj]
        users_obj_reverse.reverse()
        chart.set_axis_labels(Axis.BOTTOM, [str(u) for u in users_obj])

    google_chart = chart.get_url()

    message = '<a href="/">Main Page</a> &rarr; <a href="/graphs/listgroups/">Graphs: Select Group</a> &rarr; Select Graph for ' + str(group_obj)
    return render_to_response('graphs/select_graph.html', locals())










