from collections.abc import Callable, Iterable, Mapping
from typing import Any
from django.core.mail import send_mail
import threading
import logging
from datetime import date,datetime
from .custom_config import get_global_master_details
from dotenv import load_dotenv
import os
load_dotenv()

student_reg_email_notification_to_student_logger = logging.getLogger("student-reg-email-to-student")
student_reg_email_notification_to_managers_logger = logging.getLogger("student-reg-email-to-managers")
student_reg_email_notification_to_diretors_logger = logging.getLogger("student-reg-email-to-directors")


logger = logging.getLogger("installment-collection-student-notification-email")

def send_email_for_installment_dues():

    try:
        send_mail(
            "Subject here",
            "Testing",
            "shansiraj.lk@gmail.com",
            ["sahlanizam.lk@gmail.com"],
            fail_silently=False,
        )

        logger.info("Sending Sucess")
    except Exception as exp:
        logger.exception("Error")
        
class Email():

    def __init__(self):
        self.subject = ""
        self.message = ""
        self.from_email = ""
        self.to_email = ""

    # setter method
    def set_subject(self, x):
        self.subject = x

    def set_message(self, x):
        self.message = x

    def set_from_email(self,x):
        self.from_email = x

    def set_to_email(self,x):
        self.to_email = x

    # getter method
    def get_subject(self):
        return self.subject

    def get_message(self):
        return self.message

    def get_from_email(self):
        return self.from_email

    def get_to_email(self):
        return self.to_email


def student_reg_student_email(program_register):

    
    message = "Student Registration Details \n\n"
    message += "Registration Number \t: " + str(program_register.id) + "\n"
    message += "Student Name \t\t: " + program_register.student.name_title + " " + program_register.student.first_name + " " + program_register.student.last_name + "\n"
    message += "Course \t\t\t: " + program_register.study_program.program_name.upper() + "(" +program_register.study_program.program_code.upper() +")"+ "\n"
    message += "Registered Date \t\t:" + str(program_register.registered_date) + "\n"
    message += "Student Counsellor \t:"+ program_register.counsellor.user.first_name.upper() + " " + program_register.counsellor.middle_name.upper()

    return message


def student_reg_director_email(program_register):

    context = get_global_master_details()

    
    message = "Student Registration Details \n\n"
    message += "Registration Number \t: " + str(program_register.id) + "\n"
    message += "Student Name \t\t\t: " + program_register.student.name_title + " " + program_register.student.first_name + " " + program_register.student.last_name + "\n"
    message += "Course \t\t\t\t: " + program_register.study_program.program_name.upper() + "(" +program_register.study_program.program_code.upper() +")"+ "\n"
    message += "Registered Date \t\t: " + str(program_register.registered_date) + "\n"
    message += "Student Counsellor \t: "+ program_register.counsellor.user.first_name.upper() + " " + program_register.counsellor.middle_name.upper() + " " + program_register.counsellor.user.last_name.upper() + "\n"
    message += "Course Fee \t\t\t: "+ str(program_register.program_fee) + " "+context["currency"]+ " " + "\n"
    message += "Discount Amount \t\t: "+ str(program_register.discount_amount) + " "+context["currency"]+ " (" + str(program_register.discount_percentage)+"%)" + "\n"
    message += "Payable Course Fee \t\t: "+ str(program_register.payable_program_fee) + " "+context["currency"]+ " " + "\n"

    return message

def student_reg_manager_email(program_register):

    
    message = "Student Registration Details \n\n"
    message += "Registration Number \t: " + str(program_register.id) + "\n"
    message += "Student Name \t\t: " + program_register.student.name_title + " " + program_register.student.first_name + " " + program_register.student.last_name + "\n"
    message += "Course \t\t\t: " + program_register.study_program.program_name.upper() + "(" +program_register.study_program.program_code.upper() +")"+ "\n"
    message += "Registered Date \t\t:" + str(program_register.registered_date) + "\n"
    message += "Student Counsellor \t:"+ program_register.counsellor.user.first_name.upper() + " " + program_register.counsellor.middle_name.upper()


    return message

def send_email_to_student_on_new_reg(program_register):

    email = Email()
    email.set_subject("Student Registration (Reg No - "+str(program_register.id)+")")
    email.set_message(student_reg_student_email(program_register))
    email.set_from_email("no-reply@bmcpqrs.site")
    email.set_to_email(program_register.student.email)

    StudentRegistrationNotificationEmailToStudentThread(email).start()


def send_email_to_director_about_discounts(program_register):
    email = Email()
    email.set_subject("Special Discounts - New Student Registration (Reg No - "+str(program_register.id)+")")
    email.set_message(student_reg_director_email(program_register))
    email.set_from_email("no-reply@bmcpqrs.site")
    email.set_to_email("manas.infoqatar.lk@gmail.com")
    # email.set_to_email("codesofy.lk@gmail.com")

    StudentRegistrationNotificationEmailToDirectorsThread(email).start()



def send_email_to_managers_on_new_reg(program_register):

    email = Email()
    email.set_subject("New Student Registration (Reg No - "+str(program_register.id)+")")
    email.set_message(student_reg_manager_email(program_register))
    email.set_from_email("no-reply@bmcpqrs.site")
    email.set_to_email("salman@belmontstreet.qa")
    # email.set_to_email("codesofy.lk@gmail.com")

    StudentRegistrationNotificationEmailToManagersThread(email).start()


class StudentRegistrationNotificationEmailToStudentThread(threading.Thread):
    def __init__(self, email):
        self.email = email
        threading.Thread.__init__(self)

    def run(self):
        try:
            today = datetime.today()
            student_reg_email_notification_to_student_logger.info(str(today) + " : INFO : "+self.email.get_subject()+" : Start Sending Email to " + str(self.email.get_to_email()))

            send_mail(
                self.email.get_subject(),
                self.email.get_message(),
                self.email.get_from_email(),
                [self.email.get_to_email()],
                fail_silently=False,
            )

            student_reg_email_notification_to_student_logger.info(str(today) + " : INFO : "+self.email.get_subject()+" : Email is sent to "+str(self.email.get_to_email()))
        except Exception as exp:
            student_reg_email_notification_to_student_logger.error(str(today) + " : ERROR : "+self.email.get_subject()+" : Error occured when sending Email to "+str(self.email.get_to_email()))
            student_reg_email_notification_to_student_logger.error(exp)

class StudentRegistrationNotificationEmailToManagersThread(threading.Thread):
    def __init__(self, email):
        self.email = email
        threading.Thread.__init__(self)

    def run(self):
        try:
            today = datetime.today()
            student_reg_email_notification_to_managers_logger.info(str(today) + " : INFO : "+self.email.get_subject()+" : Start Sending Email to " + str(self.email.get_to_email()))

            send_mail(
                self.email.get_subject(),
                self.email.get_message(),
                self.email.get_from_email(),
                [self.email.get_to_email()],
                fail_silently=False,
            )

            student_reg_email_notification_to_managers_logger.info(str(today) + " : INFO : "+self.email.get_subject()+" : Email is sent to "+str(self.email.get_to_email()))
        except Exception as exp:
            student_reg_email_notification_to_managers_logger.error(str(today) + " : ERROR : "+self.email.get_subject()+" : Error occured when sending Email to "+str(self.email.get_to_email()))
            student_reg_email_notification_to_managers_logger.error(exp)


class StudentRegistrationNotificationEmailToDirectorsThread(threading.Thread):
    def __init__(self, email):
        self.email = email
        threading.Thread.__init__(self)

    def run(self):
        try:
            today = datetime.today()
            student_reg_email_notification_to_diretors_logger.info(str(today) + " : INFO : "+self.email.get_subject()+" : Start Sending Email to " + str(self.email.get_to_email()))

            send_mail(
                self.email.get_subject(),
                self.email.get_message(),
                self.email.get_from_email(),
                [self.email.get_to_email()],
                fail_silently=False,
            )

            student_reg_email_notification_to_diretors_logger.info(str(today) + " : INFO : "+self.email.get_subject()+" : Email is sent to "+str(self.email.get_to_email()))
        except Exception as exp:
            student_reg_email_notification_to_diretors_logger.error(str(today) + " : ERROR : "+self.email.get_subject()+" : Error occured when sending Email to "+str(self.email.get_to_email()))
            student_reg_email_notification_to_diretors_logger.error(exp)


    
