"""The admin analytics dashboard: /admin/analytics/ (staff only, wrapped in admin_view in urls.py)."""
import csv
from datetime import timedelta

from django.contrib import admin
from django.http import HttpResponse
from django.shortcuts import render
from django.utils import timezone

from . import analytics

DEVICES = (('', 'All devices'), ('desktop', 'Desktop'), ('mobile', 'Mobile'), ('tablet', 'Tablet'))


def dashboard(request):
    start, end, key = analytics.resolve_range(request.GET)
    device = request.GET.get('device', '')
    if device not in dict(DEVICES):
        device = ''
    page = request.GET.get('page', '')[:255]
    data = analytics.build(start, end, device=device, page=page)

    export = request.GET.get('export')
    if export in ('pages', 'clicks'):
        return _csv(export, data, start, end)

    context = {
        **admin.site.each_context(request),
        'title': 'Website analytics',
        'a': data,
        'range_key': key, 'ranges': analytics.RANGES, 'devices': DEVICES, 'device': device, 'page': page,
        'start': timezone.localtime(start), 'end': timezone.localtime(end),
        'date_from': timezone.localdate(start).isoformat(),
        'date_to': timezone.localdate(end - timedelta(microseconds=1)).isoformat(),
        'chart': {'days': data['days']},
        'heatmap': data.get('page_detail', {}).get('points', {}),
    }
    return render(request, 'admin/analytics/dashboard.html', context)


def _csv(kind, data, start, end):
    response = HttpResponse(content_type='text/csv; charset=utf-8')
    name = f"reverse-times-{kind}-{timezone.localdate(start)}-to-{timezone.localdate(end)}.csv"
    response['Content-Disposition'] = f'attachment; filename="{name}"'
    response.write('﻿')  # so Excel opens Bangla text correctly
    w = csv.writer(response)
    if kind == 'pages':
        w.writerow(['Page', 'Title', 'Section', 'Views', 'Visitors', 'Avg time (s)', 'Total minutes',
                    'Avg scroll %', 'Entries', 'Exits', 'Exit rate %', 'Bounce rate %'])
        for r in data['all_pages']:
            w.writerow([r['path'], r['title'], r['section'], r['views'], r['visitors'], r['avg_time'],
                        r['total_minutes'], r['avg_scroll'], r['entries'], r['exits'], r['exit_rate'], r['bounce_rate']])
    else:
        w.writerow(['Clicked', 'Goes to', 'Type', 'Clicks', 'On pages'])
        for r in data['top_clicks']:
            w.writerow([r['label'], r['href'], r['kind'], r['n'], r['pages']])
    return response
