package custody

import (
	"context"
	"fmt"
	"strings"

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

type LocalProvider struct{}

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

func (p *LocalProvider) CreateWallet(ctx context.Context, params CreateWalletParams) (CreatedWallet, error) {
	_ = ctx
	_ = params

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

	return CreatedWallet{
		Provider:         "local_custody",
		ExternalWalletID: "local_crypto_wallet_" + id,
	}, nil
}

func (p *LocalProvider) CreateDepositAddress(ctx context.Context, params CreateDepositAddressParams) (DepositAddress, error) {
	_ = ctx

	randomPart, err := security.RandomHex(20)
	if err != nil {
		return DepositAddress{}, err
	}

	network := strings.ToLower(strings.TrimSpace(params.Network))
	switch network {
	case "bitcoin":
		return DepositAddress{Address: "bc1q" + randomPart[:32]}, nil
	case "ethereum":
		return DepositAddress{Address: "0x" + randomPart}, nil
	case "solana":
		return DepositAddress{Address: "So" + randomPart + randomPart[:4]}, nil
	default:
		return DepositAddress{Address: fmt.Sprintf("%s_%s", network, randomPart)}, nil
	}
}
