package bankledger

import "testing"

func TestLocalProviderIssuesAccount(t *testing.T) {
	t.Parallel()

	provider := NewLocalProvider()
	issued, err := provider.IssueAccount(t.Context(), IssueAccountParams{
		UserID:        "user-1",
		AccountNumber: "1234567890",
		Currency:      "EUR",
		Country:       "NL",
	})
	if err != nil {
		t.Fatalf("issue account: %v", err)
	}
	if issued.Provider != "local_bank_ledger" {
		t.Fatalf("unexpected provider: %s", issued.Provider)
	}
	if issued.ExternalAccountID == "" {
		t.Fatal("expected external account id")
	}
	if err := ValidateIBAN(issued.IBAN); err != nil {
		t.Fatalf("issued invalid iban: %v", err)
	}
	if err := ValidateBIC(issued.BIC); err != nil {
		t.Fatalf("issued invalid bic: %v", err)
	}
	if len(issued.RoutingCodes) != 1 {
		t.Fatalf("expected issued routing code, got %d", len(issued.RoutingCodes))
	}
	if code := issued.RoutingCodes[0]; code.CodeType != "bank_code" || code.Country != "NL" || code.Network != "sepa" || code.Code != DefaultBankCode {
		t.Fatalf("unexpected routing code: %+v", code)
	}
}

func TestValidateIBAN(t *testing.T) {
	t.Parallel()

	if err := ValidateIBAN("NL88 SWFN 1234 5678 90"); err != nil {
		t.Fatalf("valid iban rejected: %v", err)
	}
	if err := ValidateIBAN("NL00SWFN1234567890"); err == nil {
		t.Fatal("expected invalid checksum to fail")
	}
}

func TestValidateBIC(t *testing.T) {
	t.Parallel()

	if err := ValidateBIC(DefaultBIC); err != nil {
		t.Fatalf("valid bic rejected: %v", err)
	}
	if err := ValidateBIC("123"); err == nil {
		t.Fatal("expected invalid bic to fail")
	}
}
