from APIs.models import Placement, Student, PlacementApplication, User
from APIs.utils import sendEmail, PlacementApplicationConditions
from APIs.constants import *
from django.shortcuts import get_object_or_404
from django.utils import timezone
import time
import pytz

REPEAT_AFTER = 10 * 60


def send_reminder_mails():
    placements = Placement.objects.all()
    students = Student.objects.all()

    for placement in placements.iterator():
        print("Processing placement: ", placement)
        # if placement is approved and email is verified
        if not (placement.offer_accepted and placement.email_verified):
            continue

        # if placement is not expired
        if placement.deadline_datetime < timezone.now():
            continue

        # send the reminder mail if the deadline is within 24 hours +- ReapetAfter
        if timezone.now() - timezone.timedelta(
                seconds=REPEAT_AFTER) <= placement.deadline_datetime - timezone.timedelta(days=1) < timezone.now() + \
                timezone.timedelta(seconds=REPEAT_AFTER):
            for student in students:
                try:
                    # if Application not found then send email
                    if not PlacementApplication.objects.filter(placement=placement, student=student).exists():
                        if student.branch in placement.allowed_branch:
                            if student.degree == 'bTech' or placement.rs_eligible is True:
                                if PlacementApplicationConditions(student, placement)[0]:
                                    student_user = get_object_or_404(User, id=student.id)
                                    # change timezone to IST
                                    deadline_datetime = placement.deadline_datetime.astimezone(pytz.timezone('Asia/Kolkata'))
                                    data = {
                                        "company_name": placement.company_name,
                                        "opening_type": 'Placement',
                                        "deadline": deadline_datetime.strftime("%A, %-d %B %Y, %-I:%M %p"),
                                        "link": PLACEMENT_OPENING_URL.format(id=placement.id)
                                    }
                                    print("Sending mail to " + student_user.email, "placement id: ", placement.id)
                                    sendEmail(student_user.email,
                                              REMINDER_STUDENTS_OPENING_TEMPLATE_SUBJECT.format(
                                                  company_name=placement.company_name),
                                              data, REMINDER_STUDENTS_OPENING_TEMPLATE)

                except Exception as e:
                    print(e)
                    continue


def run():
    while True:
        print("Sleeping for", REPEAT_AFTER, "seconds")
        time.sleep(REPEAT_AFTER)
        print("Running send_reminder_mails()")
        send_reminder_mails()