package etcd

import (
	"bytes"
	"encoding/json"
	"fmt"
	"strings"
)

type Server struct {
	ID       int64             `json:"id"`
	Type     string            `json:"type"`
	Hostname string            `json:"hostname"`
	Metadata map[string]string `json:"metadata"`
	// Frontend bool              `json:"frontend"`
}

type ServerManager interface {
	AddServer(*Server)
	DeleteServer(id string)
	GetServer() *Server
}

func (s *Server) getKey() string {
	return fmt.Sprintf("servers/%s/%d", s.Type, s.ID)
}

func (s *Server) AsJSONString() string {
	str, err := json.Marshal(s)
	if err != nil {
		//logger.Log.Errorf("error getting server as json: %s", err.Error())
		return ""
	}
	return string(str)
}

func ParseEtcdKey(key []byte) (string, string, error) {
	splittedServer := bytes.Split(key, []byte("/"))
	if len(splittedServer) != 3 {
		return "", "", fmt.Errorf("split etcd key error. %v", key)
	}
	svType := splittedServer[1]
	svID := splittedServer[2]
	return string(svType), string(svID), nil
}

func ParseEtcdServer(value []byte) (*Server, error) {
	var sv *Server
	err := json.Unmarshal(value, &sv)
	if err != nil {
		return nil, err
	}
	return sv, nil
}

func ParseEtcdParams(key []byte, value []byte) (map[string]string, error) {

	ik := string(key)
	v := string(value)

	nik := strings.TrimRight(ik, "/")
	n := strings.LastIndexByte(nik, '/')
	var nk string
	if n >= 0 {
		nk = nik[n+1:]
	} else {
		nk = nik
	}
	maps := make(map[string]string)
	maps[nk] = v
	return maps, nil

	// var ms map[string]string
	// err := json.Unmarshal(value, &ms)
	// if err != nil {
	// 	return nil, err
	// }
	// return ms, nil
}
