from smtplib import SMTPException

from django.views.generic.edit import CreateView
from django.urls import reverse
from django.http import HttpResponse, HttpResponseRedirect
from django.core.mail import send_mail, BadHeaderError
from django.template.loader import get_template
from formtools.wizard.views import CookieWizardView
from django.shortcuts import render

from .models import Employee
from .forms import PersonalForm, WorkingForm, ITForm, OfficeForm, DummyForm
from .settings import MAILS, EVA_MAIL

def success(request):
    return HttpResponse("gut gemacht!")

def send_mail_to_department(department, data):
    'send a mail to the given department with the nececcary notifications'

    print(f'send mail to department {department}...')

    # model = form.save() # maybe we dont need to save here and get the model instance in another way?
    context = {'data': data}

    # add all relevant fields of the form to the template context
    # data = MAILS[department]['DATA']
    # for key in data:
    #     context['data'][key] = form.cleaned_data[key]

    try:
         mail_template = get_template(f'evapp/{department}_mail.txt')
         send_mail(
             'EVA: Neuzugang',
             mail_template.render(context),
             EVA_MAIL,
             [MAILS[department]['MAIL']],
             fail_silently=False)
    except BadHeaderError:
        # modell.delete()
        return HttpResponse('Invalid header found. Data not saved!')
    except SMTPException:
        # modell.delete()
        return HttpResponse('Error in sending mails (propably wrong adress?). Data not saved!')


class EvaFormView(CookieWizardView):
    # model = Employee
    template_name = 'evapp/employee_form.html'
    form_list = [PersonalForm, WorkingForm, ITForm, OfficeForm, DummyForm]
    instance = None
    #    form_class = EmployeeForm

    def get_success_url(self):
        return reverse('success')

    #this makes shure, that we use the same model instance for all steps
    def get_form_instance(self,step):
        if self.instance == None:
            self.instance = Employee()
        return self.instance

    def done(self, form_list, **kwargs):
        # form = form_list[0] #.save()
        print ('INSTANCE_DICT')
        print(self.instance_dict)
        for form in form_list:
            form.save()
        form_data = [form.cleaned_data for form in form_list]
        print(form_data)
        for dep in MAILS:
            send_mail_to_department(dep, form_data)
        return HttpResponseRedirect('success')

        # return super().form_valid(form)