from django.contrib.auth.decorators import login_required
from django.db import transaction
from django.http import HttpRequest
from django.http import HttpResponse
from django.shortcuts import redirect
from django.shortcuts import render
from django.urls import reverse

from . import forms
from . import models


@login_required
def home(req: HttpRequest) -> HttpResponse:
    user_invoices = models.Invoice.objects.filter(user=req.user).all()

    if req.method == 'POST':
        form = forms.CreateInvoiceForm(data=req.POST, current_user=req.user)
        if form.is_valid():
            with transaction.atomic():
                invoice = form.save()
                formset = forms.InvoiceItemFormSet(
                    data=req.POST, instance=invoice,
                )
                if formset.is_valid():
                    formset.save()
                    return redirect(reverse('invoices:invoice', kwargs=dict(invoice_id=invoice.id)))
                else:
                    transaction.set_rollback(True)
        else:
            formset = forms.InvoiceItemFormSet(data=req.POST)

        return render(req, 'invoices/index.html', dict(form=form, formset=formset, invoices=user_invoices))

    elif req.method == 'GET':
        form = forms.CreateInvoiceForm(current_user=req.user)
        formset = forms.InvoiceItemFormSet()
        return render(req, 'invoices/index.html', dict(form=form, formset=formset, invoices=user_invoices))

    return HttpResponse(status=405)


@login_required
def view_invoice(req: HttpRequest, invoice_id: int) -> HttpResponse:
    invoice = models.Invoice.objects.get(pk=invoice_id)
    return render(req, 'invoices/view.html', dict(invoice=invoice))


@login_required
def print_invoice(req: HttpRequest, invoice_id: int):
    invoice = models.Invoice.objects.get(pk=invoice_id)
    return render(req, 'invoices/invoice.html', dict(invoice=invoice))