package algoritmo

import (
	"strings"
)

// Genera el CUF
func GenerateCUF(
	nit string,
	fechaHora string,
	sucursal string,
	modalidad string,
	tipoEmision string,
	tipoFactura string,
	tipoDocumentoSector string,
	numeroFactura string,
	puntoVenta string,
	codigoControl string,
) string {
	// Rellenar todos los campos con ceros a la izquierda
	nit = completarConCeros(nit, 13)
	fechaHora = completarConCeros(fechaHora, 17)
	sucursal = completarConCeros(sucursal, 4)
	modalidad = completarConCeros(modalidad, 1)
	tipoEmision = completarConCeros(tipoEmision, 1)
	tipoFactura = completarConCeros(tipoFactura, 1)
	tipoDocumentoSector = completarConCeros(tipoDocumentoSector, 2)
	numeroFactura = completarConCeros(numeroFactura, 10)
	puntoVenta = completarConCeros(puntoVenta, 4)

	// Concatenar los 53 caracteres
	cadenaBase := nit + fechaHora + sucursal + modalidad + tipoEmision + tipoFactura + tipoDocumentoSector + numeroFactura + puntoVenta

	// Calcular dígito verificador y agregar al final
	verificador := calcularModulo11(cadenaBase)
	cadenaCompleta := cadenaBase + verificador

	// Convertir a base 16
	cadenaHex := convertirABase16(cadenaCompleta)

	// Concatenar con el código de control (CUFD)
	cuf := cadenaHex + strings.ToUpper(codigoControl)
	return cuf
}
