from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, logout
from django.contrib.auth.models import auth
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .forms import BlogpostForm, ComentForm, Update_formpost, userForm, loginForm
from .models import Blogpost, Coment, Category, User
from .may_like import may_like, c_category
from .paginator import paginator
from django.db.models import Q
from django.db.models import Count



def home(request):
    posts = Blogpost.objects.all().order_by("-date_created")[:7]
    trending = Blogpost.objects.all().order_by("-views")[:7]
    tr_lent = len(trending)
    le_lent = len(posts)
    try:
        category = Category.objects.get(category="Entertainment")
        entertainment = Blogpost.objects.filter(category=category.pk).order_by("-date_created")[:7]
        en_lent = len(entertainment)
        fentertainment = entertainment[0].pk
    except:
        entertainment = []
        fentertainment = ''
        en_lent = 0
    try:
        category = Category.objects.get(category="News")
        news = Blogpost.objects.filter(category=category.pk).order_by("-date_created")[:7]
        new_lent = len(news)
        fnews = news[0].pk
    except:
        news = []
        fnews = ''
        new_lent=0
    try:
        category = Category.objects.get(category="Sport")
        sport = Blogpost.objects.filter(category=category.pk).order_by("-date_created")[:7]
        sp_lent = len(sport)
        fsport = sport[0].pk
    except:
        sport = []
        fsport = ''
        sp_lent=0
    try:
        context = {"posts":posts, "first":posts[0].pk, "tr_lent":tr_lent, "le_lent":le_lent,
                   "trending":trending, "ftrend":trending[0].pk,
                   "sport":sport, "fsport":fsport, "sp_lent":sp_lent,
                   "news":news, "fnews":fnews, "new_lent":new_lent,
                   "entertainment":entertainment, "fentertainment":fentertainment, "en_lent":en_lent,
                   #########
                   "may_like":may_like(), "title":"GET LATEST NEWS AND UPDATE HERE!!!",
                   "category":c_category()}
        return render (request, 'blog/index.html', context )
    except:
        return render (request, 'blog/index.html', {} )

def search(request):
    search = request.GET['search']
    title = str(f"Searched result for \"{search}\"")
    q = Q(Q(title__icontains=search) | Q(body__icontains=search) | Q(category__category__icontains=search))
    posts = list(Blogpost.objects.filter(q).order_by("-date_created"))
    page = paginator(posts, request.GET)
    if posts == []:
        title = str(f"No result for \"{search}\"")
    context = {
        "title":title,
        "page":page,
        "page_num":page["page_num"],
        "ellips":page["ellips"],
        "category":c_category(),
        "search":search
    }
    return render (request, 'blog/search.html', context)

def category(request):
    pk = request.GET["pk"]
    title = Category.objects.get(pk=pk).category
    category = list(Blogpost.objects.filter(category=pk).order_by("-date_created"))
    page = paginator(category, request.GET)
    context = {
        "title":title,
        "category":category,
        "page":page,
        "page_num":page["page_num"],
        "category":c_category(),
        "ellips":page["ellips"]
    }
    return render (request, 'blog/category.html', context )

def logoutuser(request):
    logout(request)
    return redirect('staff')

def login(request):
    if request.method == 'POST':
        username = request.POST["username"]
        password = request.POST["password"]
        if User.objects.filter(username=username).exists():
            user = authenticate(username=username, password=password)
            if user is not None and user.is_staff:
                auth.login(request, user)
            else:
                messages.info(request, "ONLY STAFFS CAN LOGIN!!!")
        else:
            messages.info(request, "USERNAME NOT EXISTED!!!")
    return redirect('staff')

def staff(request):
    form = userForm()
    login = loginForm()
    if request.method == 'POST':
        username = request.POST["username"]
        first_name = request.POST["first_name"]
        last_name = request.POST["last_name"]
        phone_number = request.POST["phone_number"]
        email = request.POST["email"]
        password = request.POST["password"]
        if not User.objects.filter(email=email).exists():
            if not User.objects.filter(phone_number=phone_number).exists():
                if not User.objects.filter(username=username).exists():
                    user = User.objects.create(username=username,
                                              phone_number=phone_number,
                                              email=email,
                                              first_name=first_name,
                                              last_name=last_name,
                                              password=password
                                              )
                    user.save()
                    messages.info(request, f"ACCOUNT CREATED SUCCESSFULLY\nWELCOME {username.upper()}")
                else:
                    messages.info(request, "USERNAME ALREADY EXISTED!!!")
            else:
                messages.info(request, "PHONE NUMBER ALREADY EXISTED!!!")
        else:
            messages.info(request, "EMAIL ALREADY EXISTED!!!")
    #PAGINATOR
    posts = list(Blogpost.objects.all().order_by("-date_created"))
    page = paginator(posts, request.GET)
    context = {
        "category":c_category(),
        "form":form,
        "login":login,
        "title":"STAFF DASHBOARD PLANETBRIEF",
        "page":page,
        "page_num":page["page_num"],
        "ellips":page["ellips"],
    }
    return render (request, 'blog/staff.html', context )


@login_required(login_url='logout')
def delete_post(request):
    if request.user.is_staff:
        pk = request.GET["pk"]
        if 'url' in request.GET:
            url = request.GET["url"]
        post = Blogpost.objects.get(pk=pk)
        post.delete()
        messages.info(request, f"POST DELETED\n{post.title}")
        try:
            return redirect(url)
        except:
            return redirect('staff')
    messages.info(request, "STAFFS ONLY\nLOGIN TO A STAFF ACCOUNT!!!")
    return redirect('logout')

@login_required(login_url='logout')
def post_update(request):
    if request.user.is_staff:
        pk = request.GET["pk"]
        posts_pk = Blogpost.objects.get(pk=pk)
        form = Update_formpost(request.POST or None, instance=posts_pk)
        if form.is_valid():
            form.save()
        return render (request, 'blog/post_update.html', {"category":c_category(), 'form':form})
    messages.info(request, "STAFFS ONLY\nLOGIN TO A STAFF ACCOUNT!!!")
    return redirect('logout')

@login_required(login_url='logout')
def post(request):
    if request.user.is_staff:
        form = BlogpostForm(request.POST or None)
        if request.method == 'POST':
            #author = request.POST["author"]
            title = request.POST["title"]
            #category = request.POST["category"]
            #tags = request.POST["tags"]
            #image = request.FILES["image"]
            #body = request.POST["body"]
            #category = Category.objects.get(pk=category)
            #blogpost = Blogpost.objects.create(
            #    author = request.user,
            #    title=title,
            #    category=category,
            #    tags=tags,
            #    image=image,
            #    body=body
            #)
            #blogpost.save()
            if form.is_valid():
                obj = form.save(commit=False)
                obj.author = request.user
                obj.image = request.FILES["image"]
                obj.save()
                form.save_m2m()
            messages.info(request, f"POST CREATED SUCCESSFULLY\n{title}")
            return redirect("staff")
        posts = Blogpost.objects.all()
        return render (request, 'blog/post.html', {"category":c_category(), 'form':form, 'posts':posts, "title":"NEW POST"})
    messages.info(request, "STAFFS ONLY\nLOGIN TO A STAFF ACCOUNT!!!")
    return redirect('logout')

def coment(request):
    if request.method == 'POST':
        form = ComentForm(request.POST)
        if form.is_valid():
            pk = request.POST["post_pk"]
            try:
                form.save()
            except:
                name = request.POST["name"]
                coment = request.POST["coment"]
                blogpost = Blogpost.objects.get(pk=pk)
                comform = Coment.objects.create(
                    name=name,
                    coment=coment,
                    post_pk=blogpost
                )
                comform.save()
            return redirect(f"/blog/details/?pk={pk}")

def details(request):
    pk = request.GET['pk']
    detail = Blogpost.objects.get(pk=pk)
    detail.views = int(detail.views)+1
    detail.save()
    trending = Blogpost.objects.all().order_by("-views")[:5]
    relateds = Blogpost.objects.filter(tags__in=detail.tags.all()).exclude(pk=pk).annotate(tag_count=Count('tags')).order_by("-tag_count", "-date_created")[:5]
    com = Coment.objects.filter(post_pk=pk).order_by("-date_created")
    if 'a' in request.GET:
        coments = com
        lnts = 0
        show = False
    else:
        coments = com[:5]
        lnts = len(com)
        show = True
    comentform = ComentForm
    context = {'detail':detail,
               "lnts":lnts, "show":show,
               "relateds":relateds,
               "comentform":comentform,
               "title":detail.title,
               "trending":trending,
               "category":c_category(),
               "coments":coments}
    return render (request, 'blog/details.html', context)