package dict

import (
	"encoding/json"
	"os"

	"gopkg.in/yaml.v3"
)

func loadYaml(fn string) (Dict, error) {
	content, err := os.ReadFile(fn)
	if err != nil {
		return nil, err
	}

	var data Dict
	err = yaml.Unmarshal(content, &data)
	if err != nil {
		return nil, err
	}
	return data, nil

}

func loadYamlStr(yamlStr string) (Dict, error) {
	var data Dict
	err := yaml.Unmarshal([]byte(yamlStr), &data)
	if err != nil {
		return nil, err
	}
	return data, nil
}

func (d Dict) dumpYaml(fn string) error {
	data, err := yaml.Marshal(d)
	if err != nil {
		return err
	}
	return os.WriteFile(fn, data, 0644) // Write with user read/write, group read, and others read permissions
}

func (d Dict) dumpYamlStr() (string, error) {
	data, err := yaml.Marshal(d)
	if err != nil {
		return "", err
	}
	return string(data), nil
}

// loadJson loads the dictionary from a JSON file.
func loadJson(fn string) (Dict, error) {
	var data Dict
	content, err := os.ReadFile(fn)
	if err != nil {
		return nil, err
	}

	err = json.Unmarshal(content, &data)
	if err != nil {
		return nil, err
	}
	return data, nil
}

func loadJsonStr(jsonStr string) (Dict, error) {
	var data Dict
	err := json.Unmarshal([]byte(jsonStr), &data)
	if err != nil {
		return nil, err
	}
	return data, nil
}

// dumpJson writes the dictionary to a JSON file.
func (d Dict) dumpJson(fn string) error {
	data, err := json.Marshal(d)
	if err != nil {
		return err
	}
	return os.WriteFile(fn, data, 0644) // Write with user read/write, group read, and others read permissions
}

// dumpJsonIndent writes the dictionary to a JSON file but applies indent first.
func (d Dict) dumpJsonIndent(fn string, prefix, indent string) error {
	data, err := json.MarshalIndent(d, prefix, indent)
	if err != nil {
		return err
	}
	return os.WriteFile(fn, data, 0644) // Write with user read/write, group read, and others read permissions
}

// dumpJsonStr returns the dictionary as a JSON string.
func (d Dict) dumpJsonStr() (string, error) {
	data, err := json.Marshal(d)
	if err != nil {
		return "", err
	}
	return string(data), nil
}

// dumpJsonStr returns the dictionary as a JSON string.
func (d Dict) dumpJsonStrIndent(prefix, indent string) (string, error) {
	data, err := json.MarshalIndent(d, prefix, indent)
	if err != nil {
		return "", err
	}
	return string(data), nil
}