package main

import (
	"bytes"
	"fmt"
	"html/template"
	"time"

	wkhtml "github.com/sebastiaanklippert/go-wkhtmltopdf"

	"code.hackerspace.pl/hscloud/go/svc/invoice/templates"
	pb "code.hackerspace.pl/hscloud/proto/invoice"
)

var (
	invTmpl *template.Template
)

func init() {
	a, err := templates.Asset("invoice.html")
	if err != nil {
		panic(err)
	}
	invTmpl = template.Must(template.New("invoice.html").Parse(string(a)))
}

func renderInvoicePDF(i *pb.Invoice) ([]byte, error) {
	type item struct {
		Title     string
		UnitPrice string
		Qty       string
		VATRate   string
		TotalNet  string
		Total     string
	}

	data := struct {
		InvoiceNumber         string
		InvoicerBilling       []string
		InvoicerVAT           string
		InvoicerCompanyNumber string
		InvoiceeBilling       []string
		InvoiceeVAT           string
		Date                  time.Time
		DueDate               time.Time
		IBAN                  string
		SWIFT                 string
		Proforma              bool
		ReverseVAT            bool
		USCustomer            bool
		Items                 []item
		TotalNet              string
		VATTotal              string
		Total                 string
		DeliveryCharge        string
	}{
		InvoiceNumber:         i.FinalUid,
		Date:                  time.Unix(0, i.Date),
		DueDate:               time.Unix(0, i.DueDate),
		IBAN:                  i.Data.Iban,
		SWIFT:                 i.Data.Swift,
		InvoicerVAT:           i.Data.InvoicerVatId,
		InvoicerCompanyNumber: i.Data.InvoicerCompanyNumber,
		InvoiceeVAT:           i.Data.CustomerVatId,
		Proforma:              i.State == pb.Invoice_STATE_PROFORMA,
		ReverseVAT:            i.Data.ReverseVat,
		USCustomer:            i.Data.UsCustomer,

		InvoicerBilling: make([]string, len(i.Data.InvoicerBilling)),
		InvoiceeBilling: make([]string, len(i.Data.CustomerBilling)),
	}

	for d, s := range i.Data.InvoicerBilling {
		data.InvoicerBilling[d] = s
	}
	for d, s := range i.Data.CustomerBilling {
		data.InvoiceeBilling[d] = s
	}

	unit := i.Unit

	for _, it := range i.Data.Item {
		data.Items = append(data.Items, item{
			Title:     it.Title,
			Qty:       fmt.Sprintf("%d", it.Count),
			UnitPrice: fmt.Sprintf(unit+"%.2f", float64(it.UnitPrice)/100),
			VATRate:   fmt.Sprintf("%.2f%%", float64(it.Vat)/1000),
			TotalNet:  fmt.Sprintf(unit+"%.2f", float64(it.TotalNet)/100),
			Total:     fmt.Sprintf(unit+"%.2f", float64(it.Total)/100),
		})
	}

	data.TotalNet = fmt.Sprintf(unit+"%.2f", float64(i.TotalNet)/100)
	data.VATTotal = fmt.Sprintf(unit+"%.2f", float64(i.Total-i.TotalNet)/100)
	data.Total = fmt.Sprintf(unit+"%.2f", float64(i.Total)/100)
	data.DeliveryCharge = fmt.Sprintf(unit+"%.2f", float64(0))

	var b bytes.Buffer
	err := invTmpl.Execute(&b, &data)
	if err != nil {
		return []byte{}, err
	}

	pdfg, err := wkhtml.NewPDFGenerator()
	if err != nil {
		return []byte{}, err
	}
	pdfg.Dpi.Set(600)
	pdfg.NoCollate.Set(false)
	pdfg.PageSize.Set(wkhtml.PageSizeA4)

	pdfg.AddPage(wkhtml.NewPageReader(&b))

	if err := pdfg.Create(); err != nil {
		return []byte{}, err
	}
	return pdfg.Bytes(), nil
}
