package recordingrule

import (
	"encoding/json"
	"strings"
)

var replaceMent *strings.Replacer
var replaceConfig map[string]string

func GetReplaceConfigKey(text string) string {
	return replaceMent.Replace(text)
}

func makeReplaceConfig() map[string]string {
	replaceConfig := make(map[string]string)
	for _, expr := range exprReplaceConfig.ExprList {
		key := GetReplaceConfigKey(expr.Old)
		replaceConfig[key] = expr.New
	}
	return replaceConfig
}

func dealPanels(panels []Panel) []Panel {
	if len(panels) == 0 {
		return panels
	}

	for i, panel := range panels {
		if panel.GraphPanel == nil {
			continue
		}
		if len(panel.GraphPanel.Targets) == 0 {
			continue
		}
		for j, target := range panel.GraphPanel.Targets {
			if _, ok := replaceConfig[GetReplaceConfigKey(target.Expr)]; ok {
				panels[i].GraphPanel.Targets[j].Expr = replaceConfig[GetReplaceConfigKey(target.Expr)]
			}
		}
	}
	return panels
}

func ReplacePanelExprByRecordingRuleMetrics(rawBoard string) (string, error) {
	replaceMent = strings.NewReplacer("\t", "", " ", "", "\n", "")
	replaceConfig = makeReplaceConfig()
	var board Board
	if err := json.Unmarshal([]byte(rawBoard), &board); err != nil {
		return rawBoard, err
	}
	if len(board.Panels) == 0 {
		return rawBoard, nil
	}

	for i, panel := range board.Panels {
		if panel != nil && panel.RowPanel != nil {
			board.Panels[i].RowPanel.Panels = dealPanels(panel.RowPanel.Panels)
		}

		if panel == nil || panel.GraphPanel == nil {
			continue
		}
		if len(panel.GraphPanel.Targets) == 0 {
			continue
		}
		for j, target := range panel.GraphPanel.Targets {
			if _, ok := replaceConfig[GetReplaceConfigKey(target.Expr)]; ok {
				board.Panels[i].GraphPanel.Targets[j].Expr = replaceConfig[GetReplaceConfigKey(target.Expr)]
			}
		}
	}
	ret, err := json.Marshal(board)
	if err != nil {
		return rawBoard, err
	}
	return string(ret), nil
}
