package indicators

import (
	"errors"
	"fmt"
	"strings"

	"github.com/thrasher-corp/gct-ta/indicators"
	"github.com/thrasher-corp/gocryptotrader/gctscript/modules"
)

// OHLCV locale string for OHLCV data conversion failure
const OHLCV = "OHLCV data"

var errInvalidSelector = errors.New("invalid selector")

func toFloat64(data interface{}) (float64, error) {
	switch d := data.(type) {
	case float64:
		return d, nil
	case int:
		return float64(d), nil
	case int32:
		return float64(d), nil
	case int64:
		return float64(d), nil
	default:
		return 0, fmt.Errorf(modules.ErrParameterConvertFailed, d)
	}
}

// ParseIndicatorSelector returns indicator number from string for slice selection
func ParseIndicatorSelector(in string) (int, error) {
	switch in {
	case "open":
		return 1, nil
	case "high":
		return 2, nil
	case "low":
		return 3, nil
	case "close":
		return 4, nil
	case "vol":
		return 5, nil
	default:
		return 0, errInvalidSelector
	}
}

// ParseMAType returns moving average from sring
func ParseMAType(in string) (indicators.MaType, error) {
	in = strings.ToLower(in)
	switch in {
	case "sma":
		return indicators.Sma, nil
	case "ema":
		return indicators.Ema, nil
	default:
		return 0, errInvalidSelector
	}
}
