package beneficiaries

import (
	"fmt"
	"strings"

	"github.com/niels/banking-app/backend/internal/domain"
	"github.com/niels/banking-app/backend/internal/integrations/bankledger"
	"github.com/niels/banking-app/backend/internal/routingcodes"
)

type Details struct {
	Name         string
	IBAN         string
	BIC          string
	Currency     string
	RoutingCodes []domain.RoutingCode
}

func NormalizeAndValidate(name, iban, bic, currency string, codes []domain.RoutingCode) (Details, error) {
	details := Details{
		Name:     strings.TrimSpace(name),
		IBAN:     bankledger.NormalizeIBAN(iban),
		BIC:      bankledger.NormalizeBIC(bic),
		Currency: domain.NormalizeCurrency(currency),
	}
	if details.Name == "" || len(details.Name) > 120 {
		return Details{}, fmt.Errorf("%w: name must be between 1 and 120 characters", domain.ErrValidation)
	}
	if err := bankledger.ValidateIBAN(details.IBAN); err != nil {
		return Details{}, err
	}
	if details.BIC != "" {
		if err := bankledger.ValidateBIC(details.BIC); err != nil {
			return Details{}, err
		}
	}
	if err := domain.ValidateCurrency(details.Currency); err != nil {
		return Details{}, err
	}
	codes = routingcodes.MergeInferred(codes, routingcodes.InferFromIBAN(details.IBAN))
	normalizedCodes, err := routingcodes.NormalizeAndValidate(codes)
	if err != nil {
		return Details{}, err
	}
	details.RoutingCodes = normalizedCodes
	return details, nil
}
