package kucoin

import (
	"encoding/json"
	"strings"

	"github.com/c9s/bbgo/pkg/types"
)

func parseWebSocketEvent(in []byte) (interface{}, error) {
	var resp WebSocketEvent
	var err = json.Unmarshal(in, &resp)
	if err != nil {
		return nil, err
	}

	switch resp.Type {
	case WebSocketMessageTypeAck:
		return &resp, nil

	case WebSocketMessageTypeError:
		resp.Object = string(resp.Data)
		return &resp, nil

	case WebSocketMessageTypeMessage:
		switch resp.Subject {
		case WebSocketSubjectOrderChange:
			var o WebSocketPrivateOrderEvent
			if err := json.Unmarshal(resp.Data, &o); err != nil {
				return &resp, err
			}
			resp.Object = &o

		case WebSocketSubjectAccountBalance:
			var o WebSocketAccountBalanceEvent
			if err := json.Unmarshal(resp.Data, &o); err != nil {
				return &resp, err
			}
			resp.Object = &o

		case WebSocketSubjectTradeCandlesUpdate, WebSocketSubjectTradeCandlesAdd:
			var o WebSocketCandleEvent
			if err := json.Unmarshal(resp.Data, &o); err != nil {
				return &resp, err
			}

			o.Interval = extractIntervalFromTopic(resp.Topic)
			o.Add = resp.Subject == WebSocketSubjectTradeCandlesAdd
			resp.Object = &o

		case WebSocketSubjectTradeL2Update:
			var o WebSocketOrderBookL2Event
			if err := json.Unmarshal(resp.Data, &o); err != nil {
				return &resp, err
			}
			resp.Object = &o

		case WebSocketSubjectTradeTicker:
			var o WebSocketTickerEvent
			if err := json.Unmarshal(resp.Data, &o); err != nil {
				return &resp, err
			}
			resp.Object = &o

		default:
			// return nil, fmt.Errorf("kucoin: unsupported subject: %s", resp.Subject)

		}
	}

	return &resp, nil
}

func extractIntervalFromTopic(topic string) types.Interval {
	ta := strings.Split(topic, ":")
	tb := strings.Split(ta[1], "_")
	interval := tb[1]
	return toGlobalInterval(interval)
}

func toGlobalInterval(a string) types.Interval {
	switch a {
	case "1min":
		return types.Interval1m
	case "5min":
		return types.Interval5m
	case "15min":
		return types.Interval15m
	case "30min":
		return types.Interval30m
	case "1hour":
		return types.Interval1h
	case "2hour":
		return types.Interval2h
	case "4hour":
		return types.Interval4h
	case "6hour":
		return types.Interval6h
	case "12hour":
		return types.Interval12h

	}
	return ""
}
