1package bittrex
2
3import (
4	"encoding/json"
5	"fmt"
6	"time"
7
8	"net/http"
9
10	"github.com/rivo/tview"
11	"github.com/wtfutil/wtf/view"
12)
13
14var ok = true
15var errorText = ""
16
17const baseURL = "https://bittrex.com/api/v1.1/public/getmarketsummary"
18
19// Widget define wtf widget to register widget later
20type Widget struct {
21	view.TextWidget
22
23	settings *Settings
24	summaryList
25}
26
27// NewWidget Make new instance of widget
28func NewWidget(app *tview.Application, settings *Settings) *Widget {
29	widget := Widget{
30		TextWidget: view.NewTextWidget(app, settings.common, false),
31
32		settings:    settings,
33		summaryList: summaryList{},
34	}
35
36	ok = true
37	errorText = ""
38
39	widget.setSummaryList()
40
41	return &widget
42}
43
44func (widget *Widget) setSummaryList() {
45	for symbol, currency := range widget.settings.summary.currencies {
46		mCurrencyList := widget.makeSummaryMarketList(symbol, currency.market)
47		widget.summaryList.addSummaryItem(symbol, currency.displayName, mCurrencyList)
48	}
49}
50
51func (widget *Widget) makeSummaryMarketList(currencySymbol string, market []interface{}) []*mCurrency {
52	mCurrencyList := []*mCurrency{}
53
54	for _, marketSymbol := range market {
55		mCurrencyList = append(mCurrencyList, makeMarketCurrency(marketSymbol.(string)))
56	}
57
58	return mCurrencyList
59}
60
61func makeMarketCurrency(name string) *mCurrency {
62	return &mCurrency{
63		name: name,
64		summaryInfo: summaryInfo{
65			High:           "",
66			Low:            "",
67			Volume:         "",
68			Last:           "",
69			OpenBuyOrders:  "",
70			OpenSellOrders: "",
71		},
72	}
73}
74
75/* -------------------- Exported Functions -------------------- */
76
77// Refresh & update after interval time
78func (widget *Widget) Refresh() {
79	widget.updateSummary()
80
81	widget.display()
82}
83
84/* -------------------- Unexported Functions -------------------- */
85
86func (widget *Widget) updateSummary() {
87	// In case if anything bad happened!
88	defer func() {
89		recover()
90	}()
91
92	client := &http.Client{
93		Timeout: time.Duration(5 * time.Second),
94	}
95
96	for _, baseCurrency := range widget.summaryList.items {
97		for _, mCurrency := range baseCurrency.markets {
98			request := makeRequest(baseCurrency.name, mCurrency.name)
99			response, err := client.Do(request)
100
101			if err != nil {
102				ok = false
103				errorText = "Please Check Your Internet Connection!"
104				break
105			} else {
106				ok = true
107				errorText = ""
108			}
109
110			if response.StatusCode != http.StatusOK {
111				errorText = response.Status
112				ok = false
113				break
114			} else {
115				ok = true
116				errorText = ""
117			}
118
119			defer response.Body.Close()
120			jsonResponse := summaryResponse{}
121			decoder := json.NewDecoder(response.Body)
122			decoder.Decode(&jsonResponse)
123
124			if !jsonResponse.Success {
125				ok = false
126				errorText = fmt.Sprintf("%s-%s: %s", baseCurrency.name, mCurrency.name, jsonResponse.Message)
127				break
128			}
129			ok = true
130			errorText = ""
131
132			mCurrency.Last = fmt.Sprintf("%f", jsonResponse.Result[0].Last)
133			mCurrency.High = fmt.Sprintf("%f", jsonResponse.Result[0].High)
134			mCurrency.Low = fmt.Sprintf("%f", jsonResponse.Result[0].Low)
135			mCurrency.Volume = fmt.Sprintf("%f", jsonResponse.Result[0].Volume)
136			mCurrency.OpenBuyOrders = fmt.Sprintf("%d", jsonResponse.Result[0].OpenBuyOrders)
137			mCurrency.OpenSellOrders = fmt.Sprintf("%d", jsonResponse.Result[0].OpenSellOrders)
138		}
139	}
140
141	widget.display()
142}
143
144func makeRequest(baseName, marketName string) *http.Request {
145	url := fmt.Sprintf("%s?market=%s-%s", baseURL, baseName, marketName)
146	request, _ := http.NewRequest("GET", url, nil)
147
148	return request
149}
150