# By: Riasat Ullah
# This file contains views that handle public facing pages.

from constants import api_paths, label_names as lnm, static_vars, var_names
from django.http import HttpResponse, JsonResponse
from django.views.decorators.http import require_http_methods
from taskcallweb import settings
from system_tests.test_data import test_data_policies
from translators import label_translator as lt
from utils import helpers, logging
from validations import request_validator
import datetime


@require_http_methods(['GET'])
def get_live_calendar_ics(request, subdomain, account_number):
    '''
    Gets the ics (calendar) file of on-call shifts.
    :param request: Http request
    :param subdomain: subdomain of the organization
    :param account_number: account ID of the organization
    :return: Http response
    '''
    if request.method == 'GET':
        lang = request_validator.get_user_language(request)
        if var_names.users not in request.GET and var_names.routines not in request.GET:
            return JsonResponse(lt.get_label(lnm.err_invalid_url, lang), status=403, safe=False)

        today = helpers.get_current_timestamp()
        start_date = (today - datetime.timedelta(days=60)).date().strftime(static_vars.date_format)
        end_date = (today + datetime.timedelta(days=90)).date().strftime(static_vars.date_format)
        token = helpers.create_public_request_token(subdomain, account_number)

        body = {var_names.start_date: start_date, var_names.end_date: end_date}
        if var_names.users in request.GET:
            body[var_names.preferred_username] = request.GET.get(var_names.users).split(" ")[0]
            if settings.TEST_MODE:
                status, output = 200, test_data_policies.on_call_schedule
            else:
                status, output = helpers.send_post_request(api_paths.public_user_on_call_shifts, body, token)
        elif var_names.routines in request.GET:
            body[var_names.routine_ref_id] = request.GET.get(var_names.routines)
            if settings.TEST_MODE:
                status, output = 200, test_data_policies.routine_schedule
            else:
                status, output = helpers.send_post_request(api_paths.public_routine_shifts, body, token)
        else:
            return JsonResponse(lt.get_label(lnm.err_invalid_url, lang), status=404, safe=False)

        if status == 200:
            try:
                ics = helpers.prepare_calendar(output[var_names.data], output[var_names.timezone],
                                               output[var_names.display_name])
                if ics:
                    response = HttpResponse(ics, content_type='text/calendar')
                    filename = output[var_names.display_name] + ' ' + start_date + ' - ' + end_date + '.ics'
                    content = "attachment; filename={0}".format(filename)
                    response['Content-Disposition'] = content
                    return response
                return JsonResponse(lt.get_label(lnm.err_calendar_download, lang), status=500, safe=False)
            except Exception as e:
                logging.exception(str(e))
                return JsonResponse(lt.get_label(lnm.err_calendar_download, lang), status=500, safe=False)
        else:
            return JsonResponse(lt.get_label(lnm.err_calendar_download, lang), status=500, safe=False)
