// Copyright (c) 2020 The btcsuite developers
// Use of this source code is governed by an ISC
// license that can be found in the LICENSE file.

package rpcclient

import (
	"fmt"

	"github.com/btcsuite/btcd/btcjson"
)

var connCfg = &ConnConfig{
	Host:         "localhost:8332",
	User:         "user",
	Pass:         "pass",
	HTTPPostMode: true,
	DisableTLS:   true,
}

func ExampleClient_GetDescriptorInfo() {
	client, err := New(connCfg, nil)
	if err != nil {
		panic(err)
	}
	defer client.Shutdown()

	descriptorInfo, err := client.GetDescriptorInfo(
		"wpkh([d34db33f/84h/0h/0h]0279be667ef9dcbbac55a06295Ce870b07029Bfcdb2dce28d959f2815b16f81798)")
	if err != nil {
		panic(err)
	}

	fmt.Printf("%+v\n", descriptorInfo)
	// &{Descriptor:wpkh([d34db33f/84'/0'/0']0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798)#n9g43y4k Checksum:qwlqgth7 IsRange:false IsSolvable:true HasPrivateKeys:false}
}

func ExampleClient_ImportMulti() {
	client, err := New(connCfg, nil)
	if err != nil {
		panic(err)
	}
	defer client.Shutdown()

	requests := []btcjson.ImportMultiRequest{
		{
			Descriptor: btcjson.String(
				"pkh([f34db33f/44'/0'/0']xpub6Cc939fyHvfB9pPLWd3bSyyQFvgKbwhidca49jGCM5Hz5ypEPGf9JVXB4NBuUfPgoHnMjN6oNgdC9KRqM11RZtL8QLW6rFKziNwHDYhZ6Kx/0/*)#ed7px9nu"),
			Range:     &btcjson.DescriptorRange{Value: []int{0, 100}},
			Timestamp: btcjson.TimestampOrNow{Value: 0}, // scan from genesis
			WatchOnly: btcjson.Bool(true),
			KeyPool:   btcjson.Bool(false),
			Internal:  btcjson.Bool(false),
		},
	}
	opts := &btcjson.ImportMultiOptions{Rescan: true}

	resp, err := client.ImportMulti(requests, opts)
	if err != nil {
		panic(err)
	}

	fmt.Println(resp[0].Success)
	// true
}

func ExampleClient_DeriveAddresses() {
	client, err := New(connCfg, nil)
	if err != nil {
		panic(err)
	}
	defer client.Shutdown()

	addrs, err := client.DeriveAddresses(
		"pkh([f34db33f/44'/0'/0']xpub6Cc939fyHvfB9pPLWd3bSyyQFvgKbwhidca49jGCM5Hz5ypEPGf9JVXB4NBuUfPgoHnMjN6oNgdC9KRqM11RZtL8QLW6rFKziNwHDYhZ6Kx/0/*)#ed7px9nu",
		&btcjson.DescriptorRange{Value: []int{0, 2}})
	if err != nil {
		panic(err)
	}

	fmt.Printf("%+v\n", addrs)
	// &[14NjenDKkGGq1McUgoSkeUHJpW3rrKLbPW 1Pn6i3cvdGhqbdgNjXHfbaYfiuviPiymXj 181x1NbgGYKLeMXkDdXEAqepG75EgU8XtG]
}

func ExampleClient_GetAddressInfo() {
	client, err := New(connCfg, nil)
	if err != nil {
		panic(err)
	}
	defer client.Shutdown()

	info, err := client.GetAddressInfo("2NF1FbxtUAsvdU4uW1UC2xkBVatp6cYQuJ3")
	if err != nil {
		panic(err)
	}

	fmt.Println(info.Address)             // 2NF1FbxtUAsvdU4uW1UC2xkBVatp6cYQuJ3
	fmt.Println(info.ScriptType.String()) // witness_v0_keyhash
	fmt.Println(*info.HDKeyPath)          // m/49'/1'/0'/0/4
	fmt.Println(info.Embedded.Address)    // tb1q3x2h2kh57wzg7jz00jhwn0ycvqtdk2ane37j27
}

func ExampleClient_GetWalletInfo() {
	client, err := New(connCfg, nil)
	if err != nil {
		panic(err)
	}
	defer client.Shutdown()

	info, err := client.GetWalletInfo()
	if err != nil {
		panic(err)
	}

	fmt.Println(info.WalletVersion)    // 169900
	fmt.Println(info.TransactionCount) // 22
	fmt.Println(*info.HDSeedID)        // eb44e4e9b864ef17e7ba947da746375b000f5d94
	fmt.Println(info.Scanning.Value)   // false
}

func ExampleClient_GetTxOutSetInfo() {
	client, err := New(connCfg, nil)
	if err != nil {
		panic(err)
	}
	defer client.Shutdown()

	r, err := client.GetTxOutSetInfo()
	if err != nil {
		panic(err)
	}

	fmt.Println(r.TotalAmount.String()) // 20947654.56996054 BTC
	fmt.Println(r.BestBlock.String())   // 000000000000005f94116250e2407310463c0a7cf950f1af9ebe935b1c0687ab
	fmt.Println(r.TxOuts)               // 24280607
	fmt.Println(r.Transactions)         // 9285603
	fmt.Println(r.DiskSize)             // 1320871611
}

func ExampleClient_CreateWallet() {
	client, err := New(connCfg, nil)
	if err != nil {
		panic(err)
	}
	defer client.Shutdown()

	r, err := client.CreateWallet(
		"mywallet",
		WithCreateWalletBlank(),
		WithCreateWalletPassphrase("secret"),
	)
	if err != nil {
		panic(err)
	}

	fmt.Println(r.Name) // mywallet
}
