import datetime
import logging
import json
from django.http import JsonResponse, HttpResponse
from django.utils import timezone

from django.shortcuts import get_object_or_404
from web.models.constants import GLOBAL_STUDY_ID
from web.api_views.daily_planning import get_workers_for_daily_planning, get_availabilities
from ..models import Worker

logger = logging.getLogger(__name__)

def specializations(request):
    workers = Worker.objects.filter(specialization__isnull=False).values_list('specialization').distinct()
    return JsonResponse({
        "specializations": [x[0] for x in workers]
    })


def units(request):
    workers = Worker.objects.filter(unit__isnull=False).values_list('unit').distinct()
    return JsonResponse({
        "units": [x[0] for x in workers]
    })

def workers_for_daily_planning(request):
    start_date = request.GET.get('start_date')
    workers = get_workers_for_daily_planning(request)
    workers_list_for_json = []
    if start_date is not None:
        today = timezone.now()
        start_date=datetime.datetime.strptime(start_date, '%Y-%m-%d').replace(tzinfo=today.tzinfo)
    for worker in workers:
        role = unicode(worker.roles.filter(study_id=GLOBAL_STUDY_ID)[0].role)
        worker_dict_for_json = {
            'id': worker.id,
            'flags' : [language.image.url for language in worker.languages.all() if language.image],
            'availability': worker.availability_percentage(start_date=start_date),
            'title': u"{} ({})".format(unicode(worker), role[:1].upper()),
            'role': role
        }
        workers_list_for_json.append(worker_dict_for_json)
    return JsonResponse(workers_list_for_json, safe=False)


def availabilities(request):
    result = []
    min_date = request.GET.get("start_date")
    max_date = request.GET.get("end_date")

    workers = get_workers_for_daily_planning(request)

    min_date = datetime.datetime.strptime(min_date, "%Y-%m-%d").replace(tzinfo=timezone.now().tzinfo)
    max_date = datetime.datetime.strptime(max_date, "%Y-%m-%d").replace(tzinfo=timezone.now().tzinfo)

    while min_date <= max_date:
        str_date = min_date.strftime('%Y-%m-%d')
        date_result = {"date": str_date, "workers": []}
        for worker in workers:
            if len(get_availabilities(worker, str_date)) > 0:
                date_result["workers"].append({
                    "worker_id": worker.id,
                    "initials": worker.initials(),
                })
        result.append(date_result)
        min_date += datetime.timedelta(days=1)

    return JsonResponse({
        "availabilities": result,
    })


def get_workers(request, worker_role):
    all_workers = Worker.get_workers_by_worker_type(worker_role).distinct()
    count = all_workers.count()

    data = []
    for voucher_type in all_workers:
        data.append(serialize_worker(voucher_type))

    return JsonResponse({
        "recordsTotal": count,
        "recordsFiltered": count,
        "data": data,
    })


def serialize_worker(worker):
    result = {
        "first_name": worker.first_name,
        "last_name": worker.last_name,
        "name": str(worker),
        "id": worker.id,
    }
    return result

def get_worker_availability(request):
    start_str_date = request.GET.get("start_date")
    end_str_date = request.GET.get("end_date")
    worker_id = request.GET.get("worker_id")
    
    if start_str_date is None or worker_id is None:
        context = {
            'status': '400', 'reason': 'Either start_date, worker_id or both are invalid.' 
        }
        response = HttpResponse(json.dumps(context), content_type='application/json')
        response.status_code = 400
        return response

    start_date = datetime.datetime.strptime(start_str_date, "%Y-%m-%d-%H-%M").replace(tzinfo=timezone.now().tzinfo)
    if end_str_date is None or end_str_date == start_str_date:
        start_date = start_date.replace(hour=0, minute=0, second=0)
        end_date = start_date + datetime.timedelta(days=1)
    else:
        end_date = datetime.datetime.strptime(end_str_date, "%Y-%m-%d-%H-%M").replace(tzinfo=timezone.now().tzinfo)
    worker = get_object_or_404(Worker, id=int(worker_id))

    result = {
        'start_date': start_date,
        'end_date': end_date, 
        'availability': round(worker.availability_percentage(start_date=start_date, end_date=end_date), 0)
    }
    return JsonResponse(result)