package invoice

import (
	"sort"
	"strings"

	"dev.tandem.ws/tandem/camper/pkg/auth"
	"dev.tandem.ws/tandem/camper/pkg/locale"
	"dev.tandem.ws/tandem/camper/pkg/ods"
)

func mustWriteInvoicesOds(invoices []*IndexEntry, taxes map[int]taxMap, taxColumns map[int]string, company *auth.Company, locale *locale.Locale) []byte {
	taxIDs := extractTaxIDs(taxColumns)
	columns := make([]string, 6+len(taxIDs))
	columns[0] = "Date"
	columns[1] = "Invoice Num."
	columns[2] = "Customer"
	columns[3] = "Status"
	i := 4
	for _, taxID := range taxIDs {
		columns[i] = taxColumns[taxID]
		i++
	}
	columns[i] = "Amount"
	table, err := ods.WriteTable(invoices, columns, locale, func(sb *strings.Builder, invoice *IndexEntry) error {
		ods.WriteCellDate(sb, invoice.Date)
		if err := ods.WriteCellString(sb, invoice.Number); err != nil {
			return err
		}
		if err := ods.WriteCellString(sb, invoice.CustomerName); err != nil {
			return err
		}
		if err := ods.WriteCellString(sb, invoice.StatusLabel); err != nil {
			return err
		}
		writeTaxes(sb, taxes[invoice.ID], taxIDs, company, locale)
		ods.WriteCellFloat(sb, invoice.Total, company, locale)
		return nil
	})
	if err != nil {
		panic(err)
	}
	return table
}

func extractTaxIDs(taxColumns map[int]string) []int {
	taxIDs := make([]int, len(taxColumns))
	i := 0
	for k := range taxColumns {
		taxIDs[i] = k
		i++
	}
	sort.Ints(taxIDs[:])
	return taxIDs
}

func writeTaxes(sb *strings.Builder, taxes taxMap, taxIDs []int, company *auth.Company, locale *locale.Locale) {
	for _, taxID := range taxIDs {
		var amount string
		if taxes != nil {
			amount = taxes[taxID]
		}
		ods.WriteCellFloat(sb, amount, company, locale)
	}
}
