package btcjson

func init() {
	// No special flags for commands in this file.
	flags := UsageFlag(0)

	MustRegisterCmd("getchangesinblock", (*GetChangesInBlockCmd)(nil), flags)
	MustRegisterCmd("getclaimsforname", (*GetClaimsForNameCmd)(nil), flags)
	MustRegisterCmd("getclaimsfornamebyid", (*GetClaimsForNameByIDCmd)(nil), flags)
	MustRegisterCmd("getclaimsfornamebybid", (*GetClaimsForNameByBidCmd)(nil), flags)
	MustRegisterCmd("getclaimsfornamebyseq", (*GetClaimsForNameBySeqCmd)(nil), flags)
	MustRegisterCmd("normalize", (*GetNormalizedCmd)(nil), flags)
}

// optional inputs are required to be pointers, but they support things like `jsonrpcdefault:"false"`
// optional inputs have to be at the bottom of the struct
// optional outputs require ",omitempty"
// traditional bitcoin fields are all lowercase

type GetChangesInBlockCmd struct {
	HashOrHeight *string `json:"hashorheight" jsonrpcdefault:""`
}

type GetChangesInBlockResult struct {
	Hash   string   `json:"hash"`
	Height int32    `json:"height"`
	Names  []string `json:"names"`
}

type GetClaimsForNameCmd struct {
	Name          string  `json:"name"`
	HashOrHeight  *string `json:"hashorheight" jsonrpcdefault:""`
	IncludeValues *bool   `json:"includevalues" jsonrpcdefault:"false"`
}

type GetClaimsForNameByIDCmd struct {
	Name            string   `json:"name"`
	PartialClaimIDs []string `json:"partialclaimids"`
	HashOrHeight    *string  `json:"hashorheight" jsonrpcdefault:""`
	IncludeValues   *bool    `json:"includevalues" jsonrpcdefault:"false"`
}

type GetClaimsForNameByBidCmd struct {
	Name          string  `json:"name"`
	Bids          []int32 `json:"bids"`
	HashOrHeight  *string `json:"hashorheight" jsonrpcdefault:""`
	IncludeValues *bool   `json:"includevalues" jsonrpcdefault:"false"`
}

type GetClaimsForNameBySeqCmd struct {
	Name          string  `json:"name"`
	Sequences     []int32 `json:"sequences" jsonrpcusage:"[sequence,...]"`
	HashOrHeight  *string `json:"hashorheight" jsonrpcdefault:""`
	IncludeValues *bool   `json:"includevalues" jsonrpcdefault:"false"`
}

type GetClaimsForNameResult struct {
	Hash           string        `json:"hash"`
	Height         int32         `json:"height"`
	NormalizedName string        `json:"normalizedname"`
	Claims         []ClaimResult `json:"claims"`
	// UnclaimedSupports []SupportResult `json:"unclaimedSupports"` how would this work with other constraints?
}

type SupportResult struct {
	TXID          string `json:"txid"`
	N             uint32 `json:"n"`
	Height        int32  `json:"height"`
	ValidAtHeight int32  `json:"validatheight"`
	Amount        int64  `json:"amount"`
	Address       string `json:"address,omitempty"`
	Value         string `json:"value,omitempty"`
}

type ClaimResult struct {
	ClaimID         string          `json:"claimid"`
	TXID            string          `json:"txid"`
	N               uint32          `json:"n"`
	Bid             int32           `json:"bid"`
	Sequence        int32           `json:"sequence"`
	Height          int32           `json:"height"`
	ValidAtHeight   int32           `json:"validatheight"`
	EffectiveAmount int64           `json:"effectiveamount"`
	Supports        []SupportResult `json:"supports,omitempty"`
	Address         string          `json:"address,omitempty"`
	Value           string          `json:"value,omitempty"`
}

type GetNormalizedCmd struct {
	Name string `json:"name"`
}

type GetNormalizedResult struct {
	NormalizedName string `json:"normalizedname"`
}
