import random
from time import sleep
from django.utils import timezone
from gauth.models import Location
from django.conf import settings
from analytics.send_email import send_email
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, get_bad_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 send_email_bad_reviews():
    locations = Location.objects.all()
    for location in locations:
        reviews = get_bad_reviews(location.location_id, hours=6)
        total_reviews = reviews.count()
        if total_reviews > 0:
            to = settings.ADMIN_MAINTEINER_EMAILS
            # Add location mainteiner email if it has an email
            to.append(location.recipient_email) if location.recipient_email else None

            subject = f"A bad review has been post in {location.care_name}."
            message = f'''
            <p>Hi there, </p>
            <p>There '''
            if total_reviews > 1:
                tt = f'are {total_reviews} bad reviews has'
            else:
                tt = f'is a bad review has '
            message += tt + f'been posted in {location.care_name}.</p>'
            for r in reviews:
                # link = r.location.review_site_url + '?reviewId='+r.review_id
                name = f'<p><b>Reviewer Name:</b> {r.reviewer_name}</p>'
                rating = f'<p><b>Rating:</b> {str(r.star_rating)} star rating.</p>'
                comment = f'<p><b>Comment: </b>{r.comment}</p>'
                message += name + rating + comment
            message += '<p>Regards,</p><p>Byte Trek Team</p>'

            send_email(to_list=to, subject=subject, message=message)


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