package btcwallet

import (
	"path/filepath"

	"github.com/roasbeef/btcd/chaincfg"
	"github.com/roasbeef/btcd/wire"
	"github.com/roasbeef/btcutil"
	_ "github.com/roasbeef/btcwallet/walletdb/bdb"
)

var (
	lnwalletHomeDir = btcutil.AppDataDir("lnwallet", false)
	defaultDataDir  = lnwalletHomeDir

	defaultLogFilename = "lnwallet.log"
	defaultLogDirname  = "logs"
	defaultLogDir      = filepath.Join(lnwalletHomeDir, defaultLogDirname)

	btcdHomeDir        = btcutil.AppDataDir("btcd", false)
	btcdHomedirCAFile  = filepath.Join(btcdHomeDir, "rpc.cert")
	defaultRPCKeyFile  = filepath.Join(lnwalletHomeDir, "rpc.key")
	defaultRPCCertFile = filepath.Join(lnwalletHomeDir, "rpc.cert")

	// defaultPubPassphrase is the default public wallet passphrase which is
	// used when the user indicates they do not want additional protection
	// provided by having all public data in the wallet encrypted by a
	// passphrase only known to them.
	defaultPubPassphrase = []byte("public")

	walletDbName = "lnwallet.db"
)

// Config is a struct which houses configuration paramters which modify the
// instance of BtcWallet generated by the New() function.
type Config struct {
	// DataDir is the name of the directory where the wallet's persistent
	// state should be sotred.
	DataDir string

	// LogDir is the name of the directory which should be used to store
	// generated log files.
	LogDir string

	// DebugLevel is a string representing the level of verbosity the
	// logger should use.
	DebugLevel string

	// RpcHost is the host and port to use to reach the rpc sever.
	RpcHost string // localhost:18334

	// RpcUser is the username which should be used to authentiate with the
	// rpc server.
	RpcUser string

	// RpcPass is the password which should be used to authenticate the
	// connection with the RPC server.
	RpcPass string

	// RpcNoTLS denotes if a TLS connection should be attempted when
	// connecting to the RPC server.
	RpcNoTLS bool

	// RPCCert directory where the TLS certificate of the RPC sever is
	// stored. If the RpcNoTLS is false, then this value will be unused.
	RPCCert string
	RPCKey  string

	// CACert is the raw RPC cert for btcd.
	CACert []byte

	PrivatePass []byte
	PublicPass  []byte
	HdSeed      []byte

	NetParams *chaincfg.Params
}

// networkDir returns the directory name of a network directory to hold wallet
// files.
func networkDir(dataDir string, chainParams *chaincfg.Params) string {
	netname := chainParams.Name

	// For now, we must always name the testnet data directory as "testnet"
	// and not "testnet3" or any other version, as the chaincfg testnet3
	// paramaters will likely be switched to being named "testnet3" in the
	// future.  This is done to future proof that change, and an upgrade
	// plan to move the testnet3 data directory can be worked out later.
	if chainParams.Net == wire.TestNet3 {
		netname = "testnet"
	}

	return filepath.Join(dataDir, netname)
}
