#Django core bits
from django.shortcuts import render, render_to_response, get_object_or_404
from django.http import HttpResponseRedirect, Http404, HttpResponse
from django.contrib.auth.decorators import login_required, permission_required
from django.core.urlresolvers import reverse
from django.contrib import messages
from django.template.defaultfilters import slugify

from modules.core.decorators import *
from modules.core.functions import *

#Forms
from forms import *

#Models
from models import *

from emails import *

from datetime import datetime, date, time


@permission_required('admin_users.can_access_jobs')
def jobs(request):

    today = date.today()

    published_jobs = Job.objects.filter(published=True, complete=True, closing_date__gte=today).order_by('-created')
    pending_jobs   = Job.objects.filter(published=False, complete=True).order_by('-created')
    expired_jobs   = Job.objects.filter(closing_date__lt=today, complete=True)

    return render(request,'admin/jobs/jobs.html',{'published_jobs':published_jobs,'pending_jobs':pending_jobs,'expired_jobs':expired_jobs})

@permission_required('admin_users.can_access_jobs')
def add_job(request):

    job_form = JobForm()

    if request.POST:
        job_form = JobForm(request.POST)

        if job_form.is_valid():
            try:
                job = job_form.save(commit=False)
                job.slug = slugify_unique(job.title,Job)
                job.published = True
                job.complete = True
                job.save()
                job_form.save_m2m()

                job_advert_approved(request,job)

                messages.success(request,'Job has been created')
                return HttpResponseRedirect(reverse('admin_jobs'))

            except:
                messages.error(request,'Sorry, could not create this job')

    return render(request,'admin/jobs/add-job.html',{'job_form':job_form})

@permission_required('admin_users.can_access_jobs')
def view_job(request,job_id):

    job = get_object_or_404(Job,id=job_id)

    return render(request,'admin/jobs/view-job.html',{'job':job})

@permission_required('admin_users.can_access_jobs')
def edit_job(request,job_id):

    job = get_object_or_404(Job,id=job_id)
    job_form = JobForm(instance=job)

    if request.POST:
        job_form = JobForm(request.POST,instance=job)

        if job_form.is_valid():
            try:
                job_form.save()

                messages.success(request,'Job has been updated')
                return HttpResponseRedirect(reverse('admin_jobs'))

            except:
                messages.error(request,'Sorry, could not update this job')

    return render(request,'admin/jobs/edit-job.html',{'job':job,'job_form':job_form})

@permission_required('admin_users.can_access_jobs')
def delete_job(request,job_id):

    job = get_object_or_404(Job,id=job_id)

    try:
        job.delete()
        messages.success(request,'Job Deleted')
    except:
        messages.error(request,'Could not delete Job')

    return HttpResponseRedirect(reverse('admin_jobs'))

@permission_required('admin_users.can_access_jobs')
def approve_job(request,job_id):

    job = get_object_or_404(Job,id=job_id)

    try:
        job.published = True
        job.save()

        #email here
        job_advert_approved(request,job)

        messages.success(request,'Job has been approved.')
    except:
        job.published = False
        job.save()

        messages.error(request,'Could not approve this job.')

    return HttpResponseRedirect(reverse('admin_jobs'))

@permission_required('admin_users.can_access_jobs')
def categories(request):

    categories = JobCategory.objects.all()

    return render(request,'admin/jobs/categories.html',{'categories':categories})

@permission_required('admin_users.can_access_jobs')
def add_category(request):

    category_form = JobCategoryForm()

    if request.POST:
        category_form = JobCategoryForm(request.POST)

        if category_form.is_valid():
            try:
                category = category_form.save(commit=False)
                category.slug = slugify_unique(category.title,JobCategory)
                category.save()

                messages.success(request,'Job Category has been created')
                return HttpResponseRedirect(reverse('admin_jobs_categories'))

            except:
                messages.error(request,'Sorry, could not create this category')

    return render(request,'admin/jobs/add-category.html',{'category_form':category_form})

@permission_required('admin_users.can_access_jobs')
def edit_category(request,category_id):

    category = get_object_or_404(JobCategory,id=category_id)
    category_form = JobCategoryForm(instance=category)

    if request.POST:
        category_form = JobCategoryForm(request.POST,instance=category)

        if category_form.is_valid():
            try:
                category_form.save()

                messages.success(request,'Category has been updated')
                return HttpResponseRedirect(reverse('admin_jobs_categories'))

            except:
                messages.error(request,'Sorry, could not update this job')

    return render(request,'admin/jobs/edit-category.html',{'category':category,'category_form':category_form})

@permission_required('admin_users.can_access_jobs')
def delete_category(request,category_id):

    category = get_object_or_404(JobCategory,id=category_id)

    try:
        category.delete()
        messages.success(request,'Category Deleted')
    except:
        messages.error(request,'Could not delete Job Category')

    return HttpResponseRedirect(reverse('admin_jobs_categories'))

@permission_required('admin_users.can_access_jobs')
def settings(request):

    job_settings = JobSettings.get_solo()
    settings_form = JobSettingsForm(instance=job_settings)

    if request.POST:
        settings_form = JobSettingsForm(request.POST,instance=job_settings)

        if settings_form.is_valid():
            settings_form.save()

            messages.success(request,'Settings have been updated')

    return render(request,'admin/jobs/settings.html',{'job_settings':job_settings,'settings_form':settings_form})
