import json
from string import Template
import yaml
import os


class Yaml:
    def __init__(self, yamlf):

        if os.path.exists(yamlf):
            self.yamlf = yamlf
        else:
            raise FileNotFoundError("%s 文件不存在" % yamlf)
        self._data = None
        self._data_all = None

    def data(self):
        if not self._data:
            with open(self.yamlf, "rb") as f:
                self._data = yaml.safe_load(f)
        return self._data

    def data_all(self):
        if not self._data_all:
            with open(self.yamlf, "rb") as f:
                self._data_all = list(yaml.safe_load_all(f))
        return self._data_all

    def write_yaml(self, data):
        with open(self.yamlf, 'a') as f:
            yaml.dump(data=data, stream=f, allow_unicode=True)

    def replace_yaml(self, test_data):
        with open(self.yamlf, "rb") as f1:
            common_dict = yaml.safe_load(f1)
        yaml_data = yaml.dump(test_data)
        re = Template(yaml_data).substitute(common_dict)
        return yaml.safe_load(stream=re)

    def clear_yaml(self):
        with open(self.yamlf, "w", encoding='utf-8') as f:
            f.truncate()

    def generate_data(self, test_data):
        print("--------------------")
        print(type(test_data), test_data)
        print("--------------------")
        if isinstance(test_data, dict):
            for value in test_data.values():
                print("--------------------")
                print(type(value), value)
                print("--------------------")
                if isinstance(value, dict) or isinstance(value, list):
                    self.generate_data(value)
                else:
                    if value.startswith("$"):
                        value = self.yamlf["value"]
        elif isinstance(test_data, list):
            for value in test_data:
                if isinstance(value, list) or isinstance(value, dict):
                    self.generate_data(value)
                else:
                    if value.startswith("$"):
                        value = self.yamlf["item"]
        return test_data