// msg.go
package msg

import (
	"encoding/json"
	"time"

	"github.com/decred/dcrd/chaincfg/chainhash"
)

type StratumJob struct {
	Job_id           string         `json:"job_id, omitemtpy"`
	Version          int32          `json:"version, omitemtpy"`
	Prevblock        chainhash.Hash `json:"prevblock, omitemtpy"`
	Coinbase1        string         `json:"coinbase1, omitemtpy"`
	Coinbase2        string         `json:"coinbase2, omitemtpy"`
	Bits             uint32         `json:"bits, omitemtpy"`
	Timestamp        time.Time      `json:"ts, omitemtpy"`
	Extranonce1      string         `json:"extranonce1, omitemtpy"`
	Extranonce2_size uint64         `json:"extranonce2_size, omitemtpy"`
	Extranonce2      string         `json:"extranonce2, omitemtpy"`
	Nonce            string         `json:"nonce, omitemtpy`
	Target           string         `json:"target, omitemtpy"`
	Difficulty       float64        `json:"difficulty, omitemtpy"`
	PrevblockS       string         `json:"prevblocks,omitempty"`
	PrevblockBig     string         `json:"prevblockbig,omitempty"`
	Transactions     *[]string      `json:"transactions,omitempty"`
	BitsS            string         `json:"bitss,omitempty"`
	Height           uint32         `json:"height,omitempty"`
	TransData        *[]string      `json:"data,omitempty"`
	Payloadstart     string         `json:"payloadstart,omitempty"`
	TimestampS       string         `json:"timestamps, omitempty"`
	Segwit           string         `json:"default_witness_commitment, omitempty"`
	IsClean          bool           `json:"isclean, omitempty"`
	Mintime          uint32         `json:"mintime, omitempty"`
	JobDifficulty    float64        `json:"diff, omitemtpy"`
}

type NexaStratumJob struct {
	Header           string  `json:"header, omitempty"`
	NBits            string  `json:"nBits, omitempty"`
	Id               uint64  `json:"id, omitempty"`
	CurTime          uint64  `json:"timestamp, omitemtpy"`
	Target           string  `json:"target, omitempty"`
	Height           uint32  `json:"height, omitemtpy"`
	Nonce            string  `json:"nonce, omitemtpy"`
	Extranonce1      string  `json:"extranonce1, omitemtpy"`
	Extranonce2_size uint64  `json:"extranonce2_size, omitemtpy"`
	Extranonce2      string  `json:"extranonce2, omitemtpy"`
	JobDifficulty    float64 `json:"diff, omitemtpy"`
}

type EnxStratumJob struct {
	Job_id           uint32 `json:"job_id, omitemtpy"`
	CurTime          uint64 `json:"timestamp, omitemtpy"`
	PrevBlockHash    string `json:"prev_hash, omitemtpy"`
	Target           string `json:"target, omitempty"`
	Height           uint64 `json:"height, omitemtpy"`
	Nonce            string `json:"nonce, omitemtpy"`
	Extranonce1      string `json:"extranonce1, omitemtpy"`
	Extranonce2_size uint64 `json:"extranonce2_size, omitemtpy"`
	Extranonce2      string `json:"extranonce2, omitemtpy"`
	Bits             uint32 `json:"bits, omitemtpy"`
	Data             string `json:"data, omitemtpy"`
	Gbt_id           uint32 `json:"gbt_id, omitemtpy"`
}

type AlphStratumJob struct {
	JobId            string  `json:"jobId, omitempty"`
	FromGroup        uint32  `json:"fromGroup, omitempty"`
	ToGroup          uint32  `json:"toGroup, omitempty"`
	HeaderBlob       string  `json:"headerBlob, omitempty"`
	TxsBlob          string  `json:"txsBlob, omitempty"`
	Height           uint32  `json:"height, omitempty"`
	TargetBlob       string  `json:"targetBlob, omitempty"`
	JobDifficulty    float64 `json:"diff, omitemtpy"`
	Nonce            string  `json:"nonce, omitempty"`
	Extranonce1      string  `json:"extranonce1, omitempty"`
	Extranonce2_size uint64  `json:"extranonce2_size, omitemtpy"`
}

type BlockNexaMsg struct {
	Id     uint64 `json:"id"`
	User   string `json:"user"`
	Miner  string `json:"miner"`
	Index  string `json:"index"`
	Header string `json:"header"`
	Nonce  string `json:"nonce"`
	Pow    string `json:"pow"`
	SubIdx int64  `json:"subidx"`
}

type BlockAlphMsg struct {
	Id        string `json:"id"`
	User      string `json:"user"`
	Miner     string `json:"miner"`
	Index     string `json:"index"`
	FromGroup uint32 `json:"fromGroup"`
	ToGroup   uint32 `json:"toGroup"`
	Header    string `json:"header"`
	Nonce     string `json:"nonce"`
	Txs       string `json:"txs"`
	Hash      string `json:"hash"`
	SubIdx    int64  `json:"subidx"`
}

type BlockEnxMsg struct {
	Id     uint64 `json:"id"`
	User   string `json:"user"`
	Miner  string `json:"miner"`
	Index  string `json:"index"`
	Header string `json:"header"`
	Nonce  string `json:"nonce"`
	Pow    string `json:"pow"`
	SubIdx int64  `json:"subidx"`
}

type GbtMsg struct {
	Capabilities      []string           `json:"capabilities"`
	Version           int32              `json:"version"`
	Rules             []string           `json:"rules"`
	Vbavailable       *json.RawMessage   `json:"vbavailble"`
	Vbrequired        int                `json:"varequired"`
	Previousblockhash string             `json:"previousblockhash"`
	Transactions      *[]json.RawMessage `json:"transactions"`
	Coinbaseaux       *json.RawMessage   `json:"coinbaseaux"`
	Coinbasevalue     uint64             `json:"coinbasevalue"`
	Coinbasetxn       *json.RawMessage   `json:"coinbasetxn"`
	Longpollid        string             `json:"longpollid"`
	Target            string             `json:"target"`
	Mintime           uint32             `json:"mintime"`
	Mutable           []string           `json:"mutable"`
	Noncerange        string             `json:"noncerange"`
	sigoplimit        uint32             `json:"sigolimit"`
	Sizelimit         uint32             `json:"sizelimit"`
	Curtime           uint32             `json:"curtime"`
	Bits              string             `json:"bits"`
	Height            uint32             `json:"height"`
	//Masternode        MasterNode         `json:"masternode"`
	//Superblocks       []SuperBlocks      `json:"superblock"`
	Coinbase   *json.RawMessage `json:"coinbase"`
	Segwit     string           `json:"default_witness_commitment"`
	PoolSource string           `json:"poolsource"`
}

type GbtTransaction struct {
	Data    string             `json:"data"`
	Hash    string             `json:"hash"`
	Depends *[]json.RawMessage `json:"depends"`
	Fee     int                `json:"fee"`
	Sigops  int                `json:"sigops"`
	Txid    string             `json:"txid"`
}

type BlockGrsMsg struct {
	User   string `json:"user"`
	Miner  string `json:"miner"`
	Index  string `json:"index"`
	Header string `json:"header"`
	Nonce  string `json:"nonce"`
	Pow    string `json:"pow"`
	SubIdx int64  `json:"subidx"`

	Data []byte `json:"data"`
}

type GetBlockHeaderMsg struct {
	Height        int    `json:"height"`
	Nonce         string `json:"nonce"`
	Confirmations int    `json:"confirmations"`
}

type GetBlockHeaderMsgInt struct {
	Height        int    `json:"height"`
	Nonce         uint32 `json:"nonce"`
	Confirmations int    `json:"confirmations"`
}

type GetBlockStatsMsg struct {
	Height   int     `json:"height"`
	Subsidy  float64 `json:"subsidy"`
	Totalfee float64 `json:"totalfee"`
}