package main

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

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

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

var (
	invTmpl map[string]*template.Template

	languages       = []string{"en", "pl"}
	defaultLanguage = "en"
)

func init() {
	invTmpl = make(map[string]*template.Template)
	for _, language := range languages {
		filename := fmt.Sprintf("invoice_%s.html", language)
		a, err := templates.Asset(filename)
		if err != nil {
			panic(err)
		}
		invTmpl[language] = template.Must(template.New(filename).Parse(string(a)))
	}
}

func renderInvoicePDF(i *pb.Invoice, language string) ([]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))

	if _, ok := invTmpl[language]; !ok {
		language = defaultLanguage
	}

	var b bytes.Buffer
	err := invTmpl[language].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
}
