package settings

import (
	"encoding/json"
	"errors"
	"strconv"
	"time"

	"github.com/alexanderzobnin/grafana-zabbix/pkg/gtime"

	"github.com/grafana/grafana-plugin-sdk-go/backend"
)

// parseTimeoutValue parses a timeout value from various types (string, float64, int64, int)
// and returns it as int64. If the value is empty or invalid, it returns the default value.
// The fieldName parameter is used for error messages.
func parseTimeoutValue(value interface{}, defaultValue int64, fieldName string) (int64, error) {
	switch t := value.(type) {
	case string:
		if t == "" {
			return defaultValue, nil
		}
		timeoutInt, err := strconv.Atoi(t)
		if err != nil {
			return 0, errors.New("failed to parse " + fieldName + ": " + err.Error())
		}
		return int64(timeoutInt), nil
	case float64:
		return int64(t), nil
	case int64:
		return t, nil
	case int:
		return int64(t), nil
	default:
		return defaultValue, nil
	}
}

func ReadZabbixSettings(dsInstanceSettings *backend.DataSourceInstanceSettings) (*ZabbixDatasourceSettings, error) {
	zabbixSettingsDTO := &ZabbixDatasourceSettingsDTO{}

	err := json.Unmarshal(dsInstanceSettings.JSONData, &zabbixSettingsDTO)
	if err != nil {
		return nil, err
	}

	if zabbixSettingsDTO.AuthType == "" {
		zabbixSettingsDTO.AuthType = AuthTypeUserLogin
	}

	if zabbixSettingsDTO.TrendsFrom == "" {
		zabbixSettingsDTO.TrendsFrom = "7d"
	}
	if zabbixSettingsDTO.TrendsRange == "" {
		zabbixSettingsDTO.TrendsRange = "4d"
	}
	if zabbixSettingsDTO.CacheTTL == "" {
		zabbixSettingsDTO.CacheTTL = "1h"
	}

	trendsFrom, err := gtime.ParseInterval(zabbixSettingsDTO.TrendsFrom)
	if err != nil {
		return nil, err
	}

	trendsRange, err := gtime.ParseInterval(zabbixSettingsDTO.TrendsRange)
	if err != nil {
		return nil, err
	}

	cacheTTL, err := gtime.ParseInterval(zabbixSettingsDTO.CacheTTL)
	if err != nil {
		return nil, err
	}

	timeout, err := parseTimeoutValue(zabbixSettingsDTO.Timeout, 30, "timeout")
	if err != nil {
		return nil, err
	}

	queryTimeout, err := parseTimeoutValue(zabbixSettingsDTO.QueryTimeout, 60, "queryTimeout")
	if err != nil {
		return nil, err
	}

	// Default to 60 seconds if queryTimeout is 0 or negative
	if queryTimeout <= 0 {
		queryTimeout = 60
	}

	zabbixSettings := &ZabbixDatasourceSettings{
		AuthType:                zabbixSettingsDTO.AuthType,
		Trends:                  zabbixSettingsDTO.Trends,
		TrendsFrom:              trendsFrom,
		TrendsRange:             trendsRange,
		CacheTTL:                cacheTTL,
		Timeout:                 time.Duration(timeout) * time.Second,
		QueryTimeout:            time.Duration(queryTimeout) * time.Second,
		DisableDataAlignment:    zabbixSettingsDTO.DisableDataAlignment,
		DisableReadOnlyUsersAck: zabbixSettingsDTO.DisableReadOnlyUsersAck,
	}

	return zabbixSettings, nil
}
