package bankledger

import (
	"context"
	"fmt"
	"strings"

	"github.com/niels/banking-app/backend/internal/domain"
	"github.com/niels/banking-app/backend/internal/security"
)

type LocalProvider struct{}

func NewLocalProvider() *LocalProvider {
	return &LocalProvider{}
}

func (p *LocalProvider) IssueAccount(ctx context.Context, params IssueAccountParams) (IssuedAccount, error) {
	_ = ctx

	country := strings.ToUpper(strings.TrimSpace(params.Country))
	if country == "" {
		country = "NL"
	}
	if country != "NL" {
		return IssuedAccount{}, fmt.Errorf("%w: local bank ledger only issues NL IBANs", domain.ErrValidation)
	}

	iban, err := GenerateDutchIBAN(params.AccountNumber)
	if err != nil {
		return IssuedAccount{}, err
	}

	externalID, err := security.RandomHex(16)
	if err != nil {
		return IssuedAccount{}, err
	}

	return IssuedAccount{
		Provider:          "local_bank_ledger",
		ExternalAccountID: "local_bank_account_" + externalID,
		IBAN:              iban,
		BIC:               DefaultBIC,
		RoutingCodes: []domain.RoutingCode{
			{CodeType: "bank_code", Country: "NL", Network: "sepa", Code: DefaultBankCode},
		},
	}, nil
}
