from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseRedirect, Http404
from django.core.urlresolvers import reverse
from django.contrib import messages

from django.views.decorators.csrf import csrf_exempt

from modules.core.decorators import members_only

from datetime import date

# Forms
from forms import CPDSubmissionForm, CPDSubmissionEvidenceForm, CPDReflectionForm, CPDNLSubmissionForm

# Models
from modules.members.models import Member
from models import CPDSubmission, CPDSubmissionYear, CPDSubmissionEvidence, CPDCategory

# email_address
import emails


@members_only
def cpd_submissions(request):

    member = get_object_or_404(Member, user=request.user)
    cpd_submissions = CPDSubmission.objects.filter(member=member, approved=True)
    pending_submissions = CPDSubmission.objects.filter(member=member, approved=False)

    today = date.today()
    if today.month >= 9:
        start_date = date(today.year, 9, 1)
    else:
        start_date = date(today.year - 1, 9, 1)

    try:
        current_year = CPDSubmissionYear.objects.get(start_date=start_date, member=member)
    except CPDSubmissionYear.DoesNotExist:
        if today.month >= 9:
            end_date = date(today.year + 1, 8, 31)
        else:
            end_date = date(today.year, 8, 31)
        current_year = CPDSubmissionYear(start_date=start_date, end_date=end_date, member=member)
        current_year.save()

    previous_years = CPDSubmissionYear.objects.filter(member=member, start_date__lt=start_date)

    return render(request, 'members/cpd/cpd-submissions.html', {
        'cpd_submissions': cpd_submissions,
        'pending_submissions': pending_submissions,
        'previous_years': previous_years
    })


@members_only
def submit_cpd(request):

    member = get_object_or_404(Member, user=request.user)

    cpd_submission_form = CPDSubmissionForm()
    cpd_nl_submission_form = CPDNLSubmissionForm(prefix='nl')
    cpd_reflection_form = CPDReflectionForm()
    not_listed = False
    submission_item_id = False
    cpd_categories = CPDCategory.objects.all()

    file_form = CPDSubmissionEvidenceForm(prefix='file_1')
    file_forms = [file_form]

    if request.POST:

        cpd_submission_form = CPDSubmissionForm(request.POST, request.FILES)
        cpd_nl_submission_form = CPDNLSubmissionForm(request.POST, request.FILES, prefix='nl')
        cpd_reflection_form = CPDReflectionForm(request.POST)

        errors = False
        cpd_submission = False

        if request.POST.get('not_listed'):
            not_listed = True
            if cpd_nl_submission_form.is_valid() and cpd_reflection_form.is_valid():
                cpd_submission = cpd_nl_submission_form.save(commit=False)
                cpd_submission.member = member
                cpd_submission.save()

                cpd_reflection_form = CPDReflectionForm(request.POST, instance=cpd_submission)
                cpd_reflection_form.save()

            else:
                errors = True

        else:
            if cpd_submission_form.is_valid() and cpd_reflection_form.is_valid():

                cpd_submission = cpd_submission_form.save(commit=False)
                cpd_submission.member = member
                cpd_submission.cpd_category = cpd_submission.cpd_item.category
                cpd_submission.points_value = cpd_submission.cpd_item.cpd_points
                cpd_submission.activity_name = cpd_submission.cpd_item.name
                cpd_submission.approved = True
                cpd_submission.save()

                cpd_reflection_form = CPDReflectionForm(request.POST, instance=cpd_submission)
                cpd_reflection_form.save()

            else:
                errors = True

        if not errors:
            posted_files = request.POST.getlist('files')
            file_forms = []
            file_order = 1

            for posted_file in posted_files:

                if request.FILES.get('file_%s-file' % posted_file):
                    # new file
                    file_form = CPDSubmissionEvidenceForm(request.POST, request.FILES, prefix='file_%s' % (posted_file))
                    submitted_file = file_form.save(commit=False)
                    submitted_file.submission = cpd_submission
                    submitted_file.order = file_order
                    submitted_file.save()

                    new_file_form = CPDSubmissionEvidenceForm(prefix='file_%s' % (posted_file))
                    file_forms.append(new_file_form)

                else:
                    errors = True
                    file_form = CPDSubmissionEvidenceForm(prefix='file_%s' % (posted_file))
                    file_forms.append(file_form)

                file_order = file_order + 1

        if not errors:

            if request.POST.get('not_listed'):
                emails.cpd_record_submitted_pending(request=request, cpd_submission=cpd_submission)
                messages.success(request, 'Your CPD Submission has been uploaded. Your evidence will be reviewed by the CPD admin, you will be emailed once your submission has been approved.')
            else:
                emails.cpd_record_submitted(request=request, cpd_submission=cpd_submission)
                messages.success(request, 'Your CPD Submission has been uploaded.')

            return HttpResponseRedirect(reverse('account_cpd_submissions'))
        else:
            if cpd_submission:
                cpd_submission.delete()
            messages.error(request, 'Please make sure you enter all fields to continue.')

    return render(request, 'members/cpd/submit-cpd.html', {
        'cpd_categories': cpd_categories,
        'cpd_submission_form': cpd_submission_form,
        'cpd_nl_submission_form': cpd_nl_submission_form,
        'cpd_reflection_form': cpd_reflection_form,
        'not_listed': not_listed,
        'file_forms': file_forms,
        'submission_item_id': submission_item_id
    })


@csrf_exempt
@members_only
def add_evidence(request, submission_id):

    member = get_object_or_404(Member, user=request.user)
    cpd_submission = get_object_or_404(CPDSubmission, id=submission_id, member=member)

    if cpd_submission.evidence or cpd_submission.get_evidence():
        messages.warning(request, 'Sorry, this submission already has evidence associated with it.')
        return HttpResponseRedirect(reverse('account_cpd_submissions'))
    else:
        file_form = CPDSubmissionEvidenceForm(prefix='file_1')
        file_forms = [file_form]

        if request.POST:
            posted_files = request.POST.getlist('files')

            file_order = 1
            errors = False

            for posted_file in posted_files:

                if request.FILES.get('file_%s-file' % posted_file):
                    # new file
                    file_form = CPDSubmissionEvidenceForm(request.POST, request.FILES, prefix='file_%s' % (posted_file))
                    if file_form.is_valid():
                        submitted_file = file_form.save(commit=False)
                        submitted_file.submission = cpd_submission
                        submitted_file.order = file_order
                        submitted_file.save()

                        new_file_form = CPDSubmissionEvidenceForm(prefix='file_%s' % (posted_file))
                        file_forms.append(new_file_form)

                    else:
                        file_form = CPDSubmissionEvidenceForm(prefix='file_%s' % (posted_file))
                        file_forms.append(file_form)

                else:
                    errors = True
                    file_form = CPDSubmissionEvidenceForm(prefix='file_%s' % (posted_file))
                    file_forms.append(file_form)

                file_order = file_order + 1

            if not errors:
                messages.success(request, 'Your Evidence has been uploaded.')
                return HttpResponseRedirect(reverse('account_cpd_submissions'))
            else:
                for file in cpd_submission.get_evidence():
                    file.delete()

        return render(request, 'members/cpd/add-evidence.html', {'cpd_submission': cpd_submission, 'file_forms': file_forms})


@members_only
def download_evidence(request, submission_id):

    from filetransfers.api import serve_file

    member = get_object_or_404(Member, user=request.user)
    submission = get_object_or_404(CPDSubmission, id=submission_id, member=member)

    if submission.evidence:
        return serve_file(request, submission.evidence, save_as=True)
    else:
        raise Http404


@members_only
def view_reflection(request, submission_id):

    member = get_object_or_404(Member, user=request.user)
    submission = get_object_or_404(CPDSubmission, id=submission_id, member=member)

    return render(request, 'members/cpd/view-reflection.html', {'submission': submission})


@members_only
def download_submission_evidence(request, evidence_id):

    from filetransfers.api import serve_file

    member = get_object_or_404(Member, user=request.user)
    evidence = get_object_or_404(CPDSubmissionEvidence, id=evidence_id, submission__member=member)

    if evidence.file:
        return serve_file(request, evidence.file, save_as=True)
    else:
        raise Http404


@members_only
def remove_submission(request, submission_id):

    member = get_object_or_404(Member, user=request.user)
    cpd_submission = get_object_or_404(CPDSubmission, id=submission_id, member=member)

    try:
        cpd_submission.delete()
        messages.success(request, 'Submission has been removed.')
    except Exception:
        messages.error(request, 'Sorry, could not remove your submission.')

    return HttpResponseRedirect(reverse('account_cpd_submissions'))
