import random
from time import sleep
from django.utils import timezone
from .models import Review, CustomReply, Reply
from nlu_job.nlu_utils import is_a_name
from review.review_utils import reply_review
from review.review_utils import populate_reviews

from nameparser import HumanName


def un_replied_reviews_with_no_comment():
    now = timezone.now()
    date = now - timezone.timedelta(days=30)
    reviews = Review.objects.filter(comment=None, reply=None, star_rating=5, update_time__gte=date)\
        .order_by('update_time')
    return reviews


def make_parsable_name(name):
    name = HumanName(name)
    if name.first == '':
        if name.title:
            parsable_name = ' ' + name.title + ' ' + name.last
        else:
            parsable_name = ' ' + name.last
    else:
        parsable_name = ' ' + name.first.capitalize()
    return parsable_name


def generate_reply(review):
    replies = CustomReply.objects.filter(reply_category='no_comment')
    reply = random.choice(replies)
    name = review.reviewer_name
    if is_a_name(name):
        parsable_name = make_parsable_name(name)
    else:
        parsable_name = ''
    replied_text = reply.reply %parsable_name
    return replied_text


def reply_uncommented_reviews():
    reviews = un_replied_reviews_with_no_comment()
    # TODO: reply reviews in background
    for review in reviews:
        replied_text = generate_reply(review)
        response = reply_review(review=review, replied_text=replied_text)

        if response.status_code == 200:
            review_reply = Reply(replied_text=replied_text, create_time=timezone.now())
            review_reply.save()
            review.reply = review_reply
            review.save()
    sleep(60*random.randint(2, 5))


def background_task():
    populate_reviews()
    sleep(60 * random.randint(2, 5))
    reply_uncommented_reviews()