package config

import (
	"bytes"
	"encoding/json"
	"testing"
)

var (
	jsonData = `{
  "a": "b",
  "c": {
    "d": "e",
    "f": "g",
    "h": {
      "i": "j",
      "k": "l",
      "m": {
        "n": "o"
      }
    }
  },
  "p": "q"
}`
	jsonBytes = []byte(jsonData)

	mapData = map[string]interface{}{
		"a":       "b",
		"p":       "q",
		"c/d":     "e",
		"c/f":     "g",
		"c/h/i":   "j",
		"c/h/k":   "l",
		"c/h/m/n": "o",
	}
)

func TestJSONMapConversion(t *testing.T) {
	t.Parallel()

	// convert to json
	j, err := MapToJSON(mapData)
	if err != nil {
		t.Fatal(err)
	}

	// check if to json matches
	if !bytes.Equal(jsonBytes, j) {
		t.Errorf("json does not match, got %s", j)
	}

	// convert to map
	m, err := JSONToMap(jsonBytes)
	if err != nil {
		t.Fatal(err)
	}

	// and back
	j2, err := MapToJSON(m)
	if err != nil {
		t.Fatal(err)
	}

	// check if double convert matches
	if !bytes.Equal(jsonBytes, j2) {
		t.Errorf("json does not match, got %s", j)
	}
}

func TestConfigCleaning(t *testing.T) {
	t.Parallel()

	// load
	configFlat, err := JSONToMap(jsonBytes)
	if err != nil {
		t.Fatal(err)
	}

	// clean everything
	CleanFlattenedConfig(configFlat)
	if len(configFlat) != 0 {
		t.Errorf("should be empty: %+v", configFlat)
	}

	// load manuall for hierarchical config
	configHier := make(map[string]interface{})
	err = json.Unmarshal(jsonBytes, &configHier)
	if err != nil {
		t.Fatal(err)
	}

	// clean everything
	CleanHierarchicalConfig(configHier)
	if len(configHier) != 0 {
		t.Errorf("should be empty: %+v", configHier)
	}
}